[linux] bash - 마지막으로 실행 한 명령의 출력을 변수에 자동 캡처합니다.


Answers

나는 이것을 자동으로 하는 변수를 모른다. 결과를 복사하여 붙이기 만하면되는 것을 제외하고 방금 한 일을 다시 실행할 수 있습니다.

vim $(!!)

어디 !! 역사 확장은 '이전 명령'을 의미합니다.

적절한 인수 구문 분석을 방해 할 수있는 공백이나 다른 문자가 포함 된 단일 파일 이름이있을 것으로 예상되는 경우 결과 ( vim "$(!!)" )를 인용하십시오. 따옴표를 사용하지 않으면 공백이나 다른 쉘 구문 분석 토큰을 ​​포함하지 않는 한 여러 파일을 한 번에 열 수 있습니다.

Question

후속 명령에서 마지막으로 실행 한 명령의 결과를 사용할 수 있기를 원합니다. 예를 들어,

$ find . -name foo.txt
./home/user/some/directory/foo.txt

이제 내가 편집기에서 파일을 열거 나 삭제할 수 있기를 원한다고 가정 해 봅시다.

mv <some-variable-that-contains-the-result> /some/new/location

내가 어떻게 해? 어쩌면 일부 bash 변수를 사용하고 있을까요?

최신 정보:

명확히하기 위해 나는 물건을 수동으로 할당하고 싶지 않다. 내가 쓴 것은 내장 된 bash 변수와 같은 것이다.

ls /tmp
cd $_

$_ 는 이전 명령의 마지막 인수를 보유합니다. 나는 비슷한 것을 원하지만 마지막 명령의 출력을 원한다.

최종 업데이트 :

세스의 대답은 아주 잘 풀렸다. 염두에 두어야 할 몇 가지 사항 :

  • 처음으로 솔루션을 시도 할 때 touch /tmp/xtouch /tmp/x 하는 것을 잊지 마십시오.
  • 마지막 명령의 종료 코드가 성공한 경우에만 결과가 저장됩니다.



이것은 엄격하게 bash 솔루션이 아니지만 sed와 함께 파이핑을 사용하여 이전 명령 출력의 마지막 행을 가져올 수 있습니다.

먼저 폴더 "a"에있는 것을 볼 수 있습니다.

rasjani@helruo-dhcp022206::~$ find a
a
a/foo
a/bar
a/bat
a/baz
rasjani@helruo-dhcp022206::~$ 

그렇다면 ls와 cd를 사용한 예제는 sed와 piping을 다음과 같이 바꿀 것입니다 :

rasjani@helruo-dhcp022206::~$ cd `find a |sed '$!d'`
rasjani@helruo-dhcp022206::~/a/baz$ pwd
/home/rasjani/a/baz
rasjani@helruo-dhcp022206::~/a/baz$

따라서 실제 마법은 sed와 함께 발생합니다. sed와 sed에 명령을 내린 결과는 백 틱이있는 매개 변수로 사용할 수있는 마지막 행을 인쇄합니다. 또는 이것을 xargs와 결합 할 수도 있습니다. (쉘에서 "man xargs"는 친구입니다)




당신은 사용할 수 있습니다 !! : 1. 예:

~]$ ls *.~
class1.cpp~ class1.h~ main.cpp~ CMakeList.txt~ 

~]$ rm !!:1
rm class1.cpp~ class1.h~ main.cpp~ CMakeList.txt~ 


~]$ ls file_to_remove1 file_to_remove2
file_to_remove1 file_to_remove2

~]$ rm !!:1
rm file_to_remove1

~]$ rm !!:2
rm file_to_remove2



"후속 명령에서 마지막으로 실행 된 명령의 결과를 사용할 수 있기를 원합니다."라고 말하면 , 그냥 찾는 것이 아니라 모든 명령의 결과를 의미합니다.

thats 경우 - xargs 는 당신이 찾고있는 것입니다.

find . -name foo.txt -print0 | xargs -0 -I{} mv {} /some/new/location/{}

또는 출력을 먼저 보려면 관심이있는 경우 :

find . -name foo.txt -print0

!! | xargs -0 -I{} mv {} /some/new/location/{}

이 명령은 경로 및 / 또는 파일 이름에 공백이있는 경우에도 여러 파일을 처리하고 매력과 같이 작동합니다.

명령의 mv {} / some / new / location / {} 부분에 주목하십시오. 이 명령은 이전 명령으로 인쇄 된 각 행에 대해 빌드되고 실행됩니다. 여기서 이전 명령에 의해 인쇄 된 행이 {} 대신 대체됩니다.

xargs의 맨 페이지에서 발췌 :

xargs - 표준 입력에서 명령 행을 빌드하고 실행합니다.

자세한 내용은 man 페이지를 참조하십시오 : man xargs




find . -name foo.txt 1> tmpfile && mv `cat tmpfile` /path/to/some/dir/

비록 더러 웠지만 또 다른 방법입니다.




이를 수행하는 방법은 여러 가지가 있습니다. 한 가지 방법은 v=$(command) 를 사용하여 v=$(command) 의 명령 출력을 할당하는 것입니다. 예 :

v=$(date)
echo $v

그리고 역 인용 부호도 사용할 수 있습니다.

v=`date`
echo $v

Bash 초보자 가이드에서 ,

이전 스타일의 역순 대체 형식을 사용하는 경우 백 슬래시는 "$", ""또는 "\"다음에 오는 경우를 제외하고는 문자 그대로의 의미를 유지합니다. 백 슬래시 앞에없는 첫 번째 백틱은 명령 대체를 종료합니다. "$ (COMMAND)"형식을 사용할 때 괄호 사이의 모든 문자가 명령을 구성합니다. 아무도 특별하게 대우받지 않는다.

수정 : 질문에 편집 후, 이것이 OP가 찾고있는 것 같지 않습니다. 지금까지 내가 아는 한, 마지막 명령 출력을 위해 $_ 와 같은 특별한 변수는 없다.




명령을 실행 한 후 결과를 변수에 저장하기로 결정한 후이를 수행하는 한 가지 방법이 있습니다.

$ find . -name foo.txt
./home/user/some/directory/foo.txt
$ OUTPUT=`!!`
$ echo $OUTPUT
./home/user/some/directory/foo.txt
$ mv $OUTPUT somewhere/else/

또는 미리 변수에 결과를 원한다면 backticks를 사용할 수 있습니다.

$ OUTPUT=`find . -name foo.txt`
$ echo $OUTPUT
./home/user/some/directory/foo.txt



쉘을 스크립트를 포함하는 솔루션을 해킹 할 수 있다고 생각합니다.

#!/bin/sh
bash | tee /var/log/bash.out.log

그런 다음 $PROMPT_COMMAND 를 구분 기호를 출력하도록 설정하면, 해당 로그의 마지막 청크를 가져 오는 도우미 함수 (예 : _ )를 작성할 수 있으므로 다음과 같이 사용할 수 있습니다.

% find lots*of*files
...
% echo "$(_)"
... # same output, but doesn't run the command again



백틱으로 출력을 캡처하십시오.

output=`program arguments`
echo $output
emacs $output



bash 프로파일에 다음 별명을 설정할 수 있습니다.

alias s='it=$($(history | tail -2 | head -1 | cut -d" " -f4-))'

그런 다음 임의의 명령 다음에 's'를 입력하여 결과를 쉘 변수 'it'에 저장할 수 있습니다.

따라서 예제 사용법은 다음과 같습니다.

$ which python
/usr/bin/python
$ s
$ file $it
/usr/bin/python: symbolic link to `python2.6'



Related