[linux] Bash를 사용하여 마지막 명령의 출력을 변수로 자동 캡처합니까?

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

$ 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/x솔루션을 처음 시도 할 때 잊지 마십시오
  • 마지막 명령의 종료 코드가 성공한 경우에만 결과가 저장됩니다


답변

이것은 정말 해키 솔루션이지만 대부분 시간이 지나면 작동하는 것 같습니다. 테스트하는 동안 ^C커맨드 라인을 사용할 때 때로는 잘 작동하지 않는 것으로 나타 났지만 조금 더 잘 작동하도록 약간 조정했습니다.

이 해킹은 대화식 모드 해킹 일 뿐이며 다른 사람에게 추천하지 않을 것이라고 확신합니다. 백그라운드 명령은 정상보다 동작이 덜 정의 될 수 있습니다. 다른 답변은 프로그래밍 방식으로 결과를 얻는 더 좋은 방법입니다.


“솔루션”은 다음과 같습니다.

PROMPT_COMMAND='LAST="`cat /tmp/x`"; exec >/dev/tty; exec > >(tee /tmp/x)'

이 bash 환경 변수를 설정하고 원하는대로 명령을 실행하십시오. $LAST일반적으로 찾고있는 출력을 갖습니다.

startide seth> fortune
Courtship to marriage, as a very witty prologue to a very dull play.
                -- William Congreve
startide seth> echo "$LAST"
Courtship to marriage, as a very witty prologue to a very dull play.
                -- William Congreve


답변

나는 이것을 자동으로 수행하는 변수를 모른다 . 결과를 복사하여 붙여 넣기하는 것 외에 다른 작업을 수행하려면 예를 들어 방금 수행 한 모든 작업을 다시 실행할 수 있습니다.

vim $(!!)

!!‘이전 명령’을 의미하는 히스토리 확장은 어디에 있습니까 ?

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


답변

배쉬는 못생긴 언어입니다. 예, 출력을 변수에 할당 할 수 있습니다

MY_VAR="$(find -name foo.txt)"
echo "$MY_VAR"

그러나 findBash 변수에 할당 할 때 자동으로 수정되므로 캐리지 리턴 또는 줄 바꿈과 같이 하나의 결과 만 반환하고 그 결과에 “홀수”문자가없는 것이 가장 좋습니다 .

그러나 변수를 사용할 때 변수를 올바르게 인용하는 것이 좋습니다!

그것은 직접 파일을 예와 함께 행동하는 것이 낫다 find‘들 -execdir(설명서를 참조).

find -name foo.txt -execdir vim '{}' ';'

또는

find -name foo.txt -execdir rename 's/\.txt$/.xml/' '{}' ';'


답변

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

v=$(date)
echo $v

역 따옴표도 사용할 수 있습니다.

v=`date`
echo $v

에서 배쉬 초보자 가이드 ,

이전 스타일의 역 따옴표로 대체 된 형식을 사용하는 경우 백 슬래시는 “$”, “`”또는 “\”가 뒤에 나오는 경우를 제외하고 문자 그대로의 의미를 유지합니다. 백 슬래시 앞에 있지 않은 첫 번째 백틱은 명령 대체를 종료합니다. “$ (COMMAND)”양식을 사용할 때 괄호 안의 모든 문자가 명령을 구성합니다. 아무것도 특별하게 취급되지 않습니다.

편집 : 질문에서 편집 한 후에 이것은 OP가 찾고있는 것이 아닌 것 같습니다. 내가 아는 한, $_마지막 명령의 출력 과 같은 특별한 변수는 없습니다 .


답변

아주 쉽습니다. 역 따옴표를 사용하십시오.

var=`find . -name foo.txt`

그리고 나중에 언제든지 사용할 수 있습니다

echo $var
mv $var /somewhere


답변

Disclamers :

  • 이 답변은 반년 후반입니다. : D
  • 나는 무거운 TMUX 사용자입니다
  • 이것이 작동하려면 tmux에서 쉘을 실행해야합니다

tmux에서 대화식 쉘을 실행할 때 현재 터미널에 표시된 데이터에 쉽게 액세스 할 수 있습니다. 몇 가지 흥미로운 명령을 살펴 보겠습니다.

  • tmux 캡처 창 : 표시된 데이터를 tmux의 내부 버퍼 중 하나에 복사합니다. 현재 보이지 않는 기록을 복사 할 수 있지만 지금은 관심이 없습니다.
  • tmux 목록 버퍼 : 캡처 된 버퍼에 대한 정보를 표시합니다. 최신 번호는 0입니다.
  • tmux show-buffer -b (버퍼 번호) : 터미널에서 주어진 버퍼의 내용을 인쇄합니다
  • tmux paste-buffer -b (buffer num) : 주어진 버퍼의 내용을 입력으로 붙여 넣습니다 .

그래, 이것은 우리에게 지금 많은 가능성을 준다 🙂 나에 관해서는, 나는 간단한 별칭을 설정했다 : alias L="tmux capture-pane; tmux showb -b 0 | tail -n 3 | head -n 1"그리고 지금 나는 마지막 줄에 액세스 할 때마다 나는 단순히 사용$(L) 그것을 얻기 위해 한다.

이것은 프로그램이 사용하는 출력 스트림 (stdin 또는 stderr), 인쇄 방법 (ncurses 등) 및 프로그램의 종료 코드와 관계가 없으며 데이터 만 표시하면됩니다.


답변

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

#!/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