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


44

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

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**

7
당신은 할 수 없습니다; 여기에 몇 가지 배경 설명이 있습니다 . 가장 좋은 방법은 지금까지 게시 된 두 가지 답변에서 볼 수 있듯이 명령을 다시 실행하는 것입니다.
Gilles 'SO- 악마 중지'

와 같은 장치로 직접 전송 된 출력은 캡처 할 수 없지만 또는로 /dev/tty전송 된 모든 것을 캡처 할 수 있어야합니다 . stdoutstderr
Mikel

@Gilles-물론 @mattdm의 답변을 사용하지 않으면!
사이먼

@Gilles : 그러나 명령의 출력을 캡처 (통과)하고 사용자가 추가 명령에서 참조 할 수 있도록 캡처 된 출력을 제공하는 누군가가 만든 셸이있을 수 있습니다. 아마도, 다소의 합병증으로 이것을 가능하게하는 인기있는 쉘이 존재하지 않을 수도 있습니다.
imz-Ivan Zakharyaschev

답변:


40

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

1
감사! 타이핑하기가 쉽지는 않지만 마우스를 사용하는 것이 좋습니다.
methodofaction

2
$ () 대신 backticks (이 인터페이스를 위키 처리하지 않는 방법을 알 수 없음)를 사용할 수도 있지만 backtick-shift-1-shift-1-backtick을 누르는 것이 불편하다는 것을 알았습니다. 가독성을 위해 $ ()를 사용하는 습관을 들이고 있습니다.
jsbillings

@jsbillings는 아래 답변을 참조하십시오. 대답에`를 표시하기 위해 \`를 입력했습니다. 평소와 같이 '\'를 표시하려면 '\\'를 입력하십시오.
yasouser

3
+1 중첩 방법이 궁금합니다 `backtick-commands`! cd $(dirname $(which python))내가 간다!
Ed Brannin

21
참고로, 이것은 명령을 다시 실행한다는 것을 기억하십시오. 명령에 부작용이 있으면 효과가 없을 수 있습니다.
Rich Homolka

13

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

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

3
바로 그거죠. 쉘이기 때문에 사람들은 종종 루프 및 할당과 같은 Bash가 제공하는 언어 기능을 잊어 버립니다.
Evan

말할 수있다cd $dir
temporary_user_name

3
@ Aerovistae, 값이 어디에서 오는지 모른다면 따옴표가 필요합니다 :
glenn jackman

@glenn, (이것은 완전히 다른 질문 일 수는 있지만 답변이 짧은 경우 :) 따옴표를 사용하지 않으면 문제가 발생하는 예를 더 설명하고 설명 할 수 있습니까?
alexey


8

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

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

.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에서 에뮬레이션을 사용하여 이전 명령의 출력 만 캡처하도록 수정할 수 있지만 여기서는 더 복잡합니다.


6
기본 아이디어는 좋지만 구현은 좋지 않습니다. 쉘 세션의 표준 출력은 터미널이 아니라 파이프이므로 일부 프로그램은 다르게 동작합니다. stdout에 대한 쓰기와 stderr에 대한 쓰기 또는 tty에 대한 직접적인 동기화가 없으므로 예를 들어 다음 프롬프트 후에 명령 출력이 표시 될 수 있습니다. 또한 tee신호로부터 보호되지 않았습니다 ( Ctrl+C더 많은 명령을 누르고 실행 해보십시오 ). script이러한 문제가없는 유틸리티를 사용하십시오 .
Gilles 'SO- 악의를 멈춰라'

알아 둘만 한! 나는 여전히 내 명령 줄 기본 사항을 연구 중이므로 이것이 과잉 일 수 있으며 모든 컴퓨터에서 사용할 수 있기를 원하지만 좋은 수준에 도달하면 기억할 것입니다.
methodofaction

8

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

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를 기다립니다.

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

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

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

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

비평:

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

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


+1, 나를 alias tee2tty='tee $(readlink /proc/$$/fd/1)'
해냈습니다

7

이 시도:

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

6

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

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

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


1
+1-좋은 답변! GNU 화면 ( gnu.org/software/screen ) 을 사용하여 X를 실행하지 않더라도 동일한 결과를 얻을 수 있습니다.
사이먼

1
내가 말하는 것을 망설이는 것이 너무나 분명해 보였다. 그러나 다른 모든 사람들은 너무 바빠서 영리합니다. :)
mattdm

그것은 영업 이익은 할 수 있습니다 여기에 유일한 대답 재사용 마지막 줄에 - 어디 완전히 무관하고 치명적인 :) 그러나 영업 이익은 말을 한 사이가 될 수 명령을 다시 실행 다른 모든 것들 수반, 재사용 .
simon

@ 사이먼 : 사실, 내 대답은 그렇지 않습니다. 글렌도 마찬가지입니다.
Mikel

@Mikel : 맞습니다.하지만 사전에 무언가를해야합니다.
mattdm

1

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

에서 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
~ $ 

0

를 누르기 전에 출력을 다시 사용하려는 경우 출력을 Enter변수에 저장할 수 있습니다 tmp=$(. 줄의 시작과 )끝에 추가하십시오. (이것은 명령 출력의 끝에서 빈 줄을 제거하고 실제로 마지막 줄 바꿈을 제거합니다. 이는 거의 중요하지 않습니다.)

tmp=$(python -c )
echo "$tmp"
cd "$tmp"

쉘이 ksh 또는 zsh 인 경우,이를보다 자동으로 만드는 데 사용할 수있는 유용한 기능이 있습니다. (bash에서는 파이프 라인의 마지막 명령이 상위 쉘에서 실행되어야하므로 ksh (pdksh 아님) 및 zsh의 경우 만 필요하므로 bash에서는 도움이되지 않습니다.)

keep () {
  local line IFS=$'\n'
  kept=
  while read -r line; do
    printf '%s\n' "$line"
    kept=$kept$line$IFS
  done
}
alias keep=k

이 방법으로 사용하십시오 :

python -c  |k
cd $kept

0
cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" | tee $(readlink /proc/$$/fd/1))

( 4485의 답변을 바탕으로 구축 )

타이핑이 많으므로 별명을 만드십시오.

alias tee2tty='tee $(readlink /proc/$$/fd/1)'

그런 다음 간단히 전화 cd $(python -c ... | tee2tty)

물론 이것은 출력으로 무엇을하고 싶은지 이미 알고 있어야하지만 명령을 한 번만 호출 할 수 있다는 장점이 있습니다.



0

더 나은 해결책이 있습니다.

!!명령을 실행 한 후 인쇄 하면 반복 출력이 표시됩니다.

예 :

여기에 이미지 설명을 입력하십시오

기발한:

https://askubuntu.com/questions/324423/how-to-access-the-last-return-value-in-bash


!!마지막 명령의 결과를 반복하지 않고 마지막 명령을 다시 실행합니다. 경우 jot -r 1 0 10000을 반환과 1000 사이에 단일 임의의 숫자는, 다음 번 그 명령을 실행하고받은 후 539, 실행하는 !!가장 가능성이 다른 수를 줄 것이다. !!이전 명령을 실행하는 데 상당한 시간이 걸리거나 파일을 변경하는 것과 같이 반복해서는 안되는 작업을 반복하는 경우에도 바람직하지 않을 수 있습니다.
Caleb

1
좋은 캐치. 나를 잘못 증명하는 더 쉬운 방법이 있지만 : echo $ RANDOM; !!
Tebe

Sweet-몰랐어요! 감사.
Caleb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.