[bash] 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]입니다.


답변

예, 동의 할 때마다 추가 줄을 입력해야하는 이유는 무엇입니까? 리턴 값을 입력으로 리디렉션 할 수 있지만 출력 (1> & 0) 출력은 nope입니다. 또한 각 파일에 동일한 함수를 반복해서 쓰고 싶지 않습니다.

파일을 다른 곳으로 내 보내지 않고 로컬에서만 사용하려는 경우 터미널에서 함수 선언을 설정할 수 있습니다. ~/.bashrc파일이나 파일에 함수를 추가해야 ~/.profile합니다. 두 번째 경우에, 당신은 활성화해야합니다 Run command as login shell에서 Edit>Preferences>yourProfile>Command.

다음과 같이 간단한 기능을 만드십시오.

get_prev()
{
    # option 1: create an executable with the command(s) and run it
    echo $* > /tmp/exe
    bash /tmp/exe > /tmp/out

    # option 2: if your command is single command (no-pipe, no semi-colons), still it may not run correct in some exceptions
    #echo `$*` > /tmp/out

    # return the command(s) outputs line by line
    IFS=$(echo -en "\n\b")
    arr=()
    exec 3</tmp/out
    while read -u 3 -r line
    do
        arr+=($line)
        echo $line
    done
    exec 3<&-
}

기본 스크립트에서 :

#run your command:
cmd="echo hey ya; echo hey hi; printf `expr 10 + 10`'\n' ; printf $((10 + 20))'\n'"
get_prev $cmd
#or simply
get_prev "echo hey ya; echo hey hi; printf `expr 10 + 10`'\n' ; printf $((10 + 20))'\n'"

Bash는 이전 범위 밖에서도 변수를 저장합니다.

#get previous command outputs in arr
for((i=0; i<${#arr[@]}; i++)); do echo ${arr[i]}; done