programing tip

Bash에서 마지막 명령의 출력 재사용

itbloger 2020. 6. 24. 07:47
반응형

Bash에서 마지막 명령의 출력 재사용


Bash 명령의 출력이 레지스터에 저장됩니까? $?를 들어 종료 상태 대신 출력 캡처하는 것과 비슷한 것이 있습니다.

다음을 사용하여 출력을 변수에 할당 할 수 있습니다.

output=$(command)

그러나 그것은 더 타이핑입니다 ...


$(!!)명령을 사용하여 마지막 명령의 출력을 재 계산 (재사용 아님) 할 수 있습니다 .

!!자체가 실행의 마지막 명령.

$ > echo pierre
pierre
$ > echo my name is $(!!)
echo my name is $(echo pierre)
my name is pierre

내 대답은 아니오 야. Bash는 출력을 메모리의 매개 변수 또는 블록에 할당하지 않습니다. 또한 허용 된 인터페이스 작업을 통해서만 Bash에 액세스 할 수 있습니다. Bash의 개인 데이터는 해킹하지 않으면 액세스 할 수 없습니다.


이를 수행하는 한 가지 방법은 다음을 사용하는 것입니다 trap DEBUG.

f() { bash -c "$BASH_COMMAND" >& /tmp/out.log; }
trap 'f' DEBUG

이제 가장 최근에 실행 된 명령의 stdout 및 stderr은 /tmp/out.log

단점은 명령을 두 번 실행한다는 것입니다. 한 번은 출력과 오류를 리디렉션 /tmp/out.log하고 한 번은 정상으로 리디렉션 합니다. 아마도이 동작을 막을 수있는 방법이있을 것입니다.


mac을 사용하는 경우 변수에 쓰는 대신 출력을 클립 보드에 저장하지 않아도되는 경우 해결 방법으로 pbcopy 및 pbpaste를 사용할 수 있습니다.

예를 들어, 파일을 찾고 다른 파일과 내용을 다르게하기 위해이 작업을 수행하는 대신 :

$ find app -name 'one.php' 
/var/bar/app/one.php

$ diff /var/bar/app/one.php /var/bar/two.php

당신은 이것을 할 수 있습니다 :

$ find app -name 'one.php' | pbcopy
$ diff $(pbpaste) /var/bar/two.php

/var/bar/app/one.php첫 번째 명령을 실행할 때 문자열 은 클립 보드에 있습니다.

그런데, PBpbcopypbpaste스탠드 판지, 클립 보드의 동의어합니다.


anubhava의 답변에서 영감을 얻었습니다. 각 명령을 두 번 실행하므로 실제로 허용되지 않습니다.

save_output() { 
   exec 1>&3 
   { [ -f /tmp/current ] && mv /tmp/current /tmp/last; }
   exec > >(tee /tmp/current)
}

exec 3>&1
trap save_output DEBUG

이렇게하면 마지막 명령의 출력이 / tmp / last에 있고 명령이 두 번 호출되지 않습니다.


konsolebox가 말했듯이 bash 자체를 해킹해야합니다. 다음 은이를 달성하는 방법에 대한 아주 좋은 예입니다. stderred 저장소 (실제로 stdout을 채색하기위한 것)는 그것을 만드는 방법에 대한 지침을 제공합니다.

새로운 파일 기술자 내부 정의 : 나는 그것을 시도했다 .bashrc등이

exec 41>/tmp/my_console_log

(번호는 임의적 임) stderred.c내용이 fd 41에 기록되도록 수정하십시오. 일종의 작동하지만 NUL 바이트, 이상한 형식을 포함하고 기본적으로 읽을 수없는 이진 데이터입니다. C에 대해 잘 알고있는 사람이 시도해 볼 수 있습니다.

그렇다면 마지막 인쇄 된 줄을 얻는 데 필요한 모든 것은 tail -n 1 [logfile]입니다.


이것이 필요한 것이 정확히 확실하지 않으므로이 답변은 관련이 없을 수 있습니다. 당신은 항상 명령의 출력을 저장할 수 있습니다 : netstat >> output.txt, 나는 그것이 당신이 찾고있는 것이라고 생각하지 않습니다.

물론 프로그래밍 옵션이 있습니다. 해당 명령을 실행 한 후 위의 텍스트 파일을 읽도록 프로그램을 가져 와서 변수와 연결할 수 있습니다. 루비에서는 선택한 언어로 'backticks'를 사용하여 명령 출력에서 ​​변수를 만들 수 있습니다.

output = `ls`                       #(this is a comment) create variable out of command

if output.include? "Downloads"      #if statement to see if command includes 'Downloads' folder
print "there appears to be a folder named downloads in this directory."
else
print "there is no directory called downloads in this file."
end

이것을 .rb 파일에 넣고 실행 ruby file.rb하면 명령에서 변수가 만들어지고 조작 할 수 있습니다.


즉시 구현할 시간이 없다는 아이디어가 있습니다.

그러나 다음과 같은 작업을 수행하면 어떻게됩니까?

$ MY_HISTORY_FILE = `get_temp_filename`
$ MY_HISTORY_FILE=$MY_HISTORY_FILE bash -i 2>&1 | tee $MY_HISTORY_FILE
$ some_command
$ cat $MY_HISTORY_FILE
$ # ^You'll want to filter that down in practice!

There might be issues with IO buffering. Also the file might get too huge. One would have to come up with a solution to these problems.

참고URL : https://stackoverflow.com/questions/24283097/reusing-output-from-last-command-in-bash

반응형