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
첫 번째 명령을 실행할 때 문자열 은 클립 보드에 있습니다.
그런데, PB 에 pbcopy
와 pbpaste
스탠드 판지, 클립 보드의 동의어합니다.
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
'programing tip' 카테고리의 다른 글
채널을 열어 두어도 되나요? (0) | 2020.06.25 |
---|---|
ASP.NET 웹 API를 사용하는 JSONP (0) | 2020.06.24 |
System.Diagnostics.Debug.Write 출력은 어디에 나타 납니까? (0) | 2020.06.24 |
UML 클래스 다이어그램 열거 형 (0) | 2020.06.24 |
ORA-00979 표현에 의한 그룹이 아닙니다 (0) | 2020.06.24 |