명령 줄의 마지막 출력을 어떻게 재사용합니까? -c “from

콘솔의 마지막 출력을 재사용하는 방법을 알고 싶습니다.

pv-3:method Xavier$ python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
/Library/Python/2.6/site-packages
pv-3:method Xavier$ cd **LASTOUTPUT**


답변

bash 가정 :

% python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
/usr/lib/python2.7/site-packages
% cd $(!!)
cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")
% pwd
/usr/lib/python2.7/site-packages

답변

아직 언급되지 않은 변수를 사용하십시오.

dir=$( python -c ... )
cd "$dir"

답변

다른 모든 솔루션은 워크 플로 수정 또는 명령 실행을 두 번 수행하는 데 시간이 오래 걸리거나 반복 할 수없는 경우에는 적합하지 않을 수 있습니다 (예 : 파일을 삭제하고 다시 실행하면 다른 결과가 생성됨).

필요한 경우 더 복잡한 아이디어가 있습니다.

.bashrc

exec > >(tee -a ~/$$.out)

PROMPT_COMMAND='LASTLINE=$(tail -n 1 ~/$$.out)'

trap 'rm ~/$$.out' EXIT

bash 프롬프트

$ python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
/usr/lib/python2.6/dist-packages
$ cd $LASTLINE
$ pwd
/usr/lib/python2.6/dist-packages

여기에는 몇 가지 문제가 있으므로 시작점으로 사용됩니다. 예를 들어 출력 파일 ( ~/<pid>.out)이 매우 커져 디스크를 채울 수 있습니다. 또한 tee죽으면 전체 껍질이 작동을 멈출 수 있습니다.

zsh에서 preexecprecmdhook을 사용 하거나 bash에서 에뮬레이션을 사용하여 이전 명령의 출력 만 캡처하도록 수정할 수 있지만 여기서는 더 복잡합니다.


답변

전통적인 쉘을위한 작업 초안 :

ttyid=$(readlink /proc/$$/fd/1)
\___/   \______/ \___/ |  |  |
  |         |      |   |  |  \- 0: stdin
  |         |      |   |  |     1: stdout <- our interest
  |         |      |   |  |     2: stderr
  |         |      |   |  \- fd is, maybe, filedescriptor
  |         |      |   |
  |         |      |   \- $$ is the PID of the current process (shell,
  |         |      |      in our case)
  |         |      |
  |         |      \- you know, much runtime stuff is here
  |         |
  |         \- readlink extracts the symbolic link of /proc/$$/fd/1
  |            lrwx------ 1 stefan stefan 64 2011-03-18 09:11
  |            /proc/22159/fd/1 -> /dev/pts/4
  |
  \- /dev/tty3 for real shell, /dev/pts/3 for xterm

이제 화면을 파일로 분류 할 수 있습니다. sudo가 필요합니다.

id=${ttyid//\/dev\/tty}
sudo cat /dev/vcs$id > screen.dump

Apropos screendump: 그래서 명명 된 프로그램은 더 이상 작동하지 않습니다. 이전 커널에만 해당 될 수 있습니다. / dev / pts / N도 저에게 효과가 없었습니다. 어쩌면 당신은 / dev에서 MKDEV를 선택해야 할 /dev/cuaN수도 있습니다.

screen.dump를 사용하는 대신 출력을 파이프하고 싶습니다. 그러나 어떻게 든 작동하지 않습니다. 때로는 ENTER를 기다립니다.

캡처는 줄 바꿈이있는 일반적인 텍스트 파일이 아니지만 한 번에 80×50 문자가 포함됩니다.

마지막 두 줄, 명령 출력 하나, 프롬프트 줄 하나를 선택하려면 되돌리고 160자를 선택한 다음 다시 되돌리고 80을 선택합니다.

rev vcs4.dat | sed 's/\(.\{160\}\).*/\1/g' | rev | sed 's/\(.\{80\}\).*/\1/g'

궁금한 점이 있으시면 왜 rev프로그램 이 있습니까 ?

비평:

  • 첫 번째 명령이 입력되어 선이 움직입니다. 글쎄-세 번째 마지막 줄이나 무언가를 선택하기위한 숫자 운동. 나는 주로 다른 창에서 일했습니다.
  • 모든 사람에게 80×50 화면이있는 것은 아닙니다. 예, 우리는 알고 있습니다. 당신의 즐거움을 위해 $ COLUMNS와 $ ROWS가 있습니다.
  • 출력이 항상 맨 아래에있는 것은 아닙니다. 신선하고 어린 껍질이 윗줄에있을 수 있습니다. 글쎄-간단합니다 : 실행중인 쉘을 평가하십시오. 어떤 프롬프트가 사용됩니까? 프롬프트를 감지하고 쉘 프롬프트가있는 마지막 행을 찾으십시오. before (또는 2. before) 줄은 디렉토리를 포함해야합니다.

첫 번째 다이어그램은 Explain.py 로 만들어집니다.


답변

이 시도:

$ cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")
$ pwd
/Library/Python/2.6/site-packages

답변

그래서, 여기 대답이 있습니다 :

X에서 실행중인 경우 마우스로 원하는 출력을 복사하여 선택한 다음 마우스 가운데 버튼을 클릭하여 붙여 넣습니다.

텍스트 콘솔에서 실행중인 경우 gpm 과 비슷한 작업을 수행 할 수 있습니다 .


답변

(아쉽게도 실제 답변은 아니지만 여전히 궁금한 점이 있습니다. 관심있는 사람은 내가 알려줄 기능의 구현을 완료하려고 시도 할 수 있습니다.)

에서 eshell이맥스 내부, 그들은 같은 기능을하고 싶었 있지만 (단되는 완전한 방식으로 구현 아니에요 문서에 반영 ).

예를 들면 다음과 같습니다.

~ $ pwd
~
~ $ /bin/echo $$
~
~ $ /bin/pwd
/home/imz
~ $ /bin/echo $$

~ $ 

알다시피, 내장의 출력 만 $$변수 로 캡처 할 수 있습니다 .

그러나 일부 elisp 프로그래밍 ( eshell-mark-output“esh-mode.el”의 구현 참조 )을 사용하면 마지막 출력을 “표시”하여 함수의 결과로 반환하는 함수를 구현할 수 있습니다. 요청한 eshell 명령에서 해당 함수를 사용할 수 있도록 elisp 함수는 일반적인 elisp 구문을 사용하여 eshell 명령에서 사용할 수 있습니다 (예 : 괄호).

~ $ /bin/echo (buffer-name)
*eshell*
~ $ /bin/echo (car '(a b c))
a
~ $