ERR 및 트랩을 발생시키는 전체 명령줄을 가져옵니다.

ERR 및 트랩을 발생시키는 전체 명령줄을 가져옵니다.

트랩이 ERR을 발생시킨 명령을 반환하도록 하려면 어떻게 해야 합니까?

$function err_handler() { echo "$0 caused the error"; }

$ trap err_handler ERR

$ grep -ci "failed" test4 &>/dev/null
-bash caused the error

내가 원하는 출력은 다음과 같습니다

grep caused the error

그리고 아마도 (충분히 욕심이 나서) 명령줄 전체를 대체하게 될 것입니다. (해킹 없이) 가능한가요?

편집: 내 쉘이 KSH라는 것을 언급하지 않아서 죄송합니다.

답변1

명령 기록이 활성화되어 있는지 확인하고(비대화형 쉘의 경우 기본적으로 꺼져 있음) 다음을 사용하십시오.

#!/bin/bash
set -o history
function trapper () {
    printf "culprit: "
    history 1
}

trap trapper ERR

# your errors go here

답변2

Bash를 사용하는 경우 다음 $BASH_COMMAND매개변수를 사용할 수 있습니다.

BASH_COMMAND
    The command currently being executed or about to be executed, unless
    the shell is executing a command as the result of a trap, in which case
    it is the command executing at the time of the trap.

참고 사항: 먼저, $BASH_COMMAND전체 명령줄이 아닌 복합 명령에만 실패한 명령을 제공하십시오.

$ function err_handler { echo "error: $BASH_COMMAND" }
$ trap err_handler ERR
$ true blah blah blah && false herp derp
error: false herp derp

둘째, 파이프라인은 마지막 명령이 실패하는 경우에만 실패합니다. 중간 명령이 실패했지만 마지막 명령이 성공하더라도 여전히 성공합니다.

$ echo okay | false herp derp | true lol
# err_handler not called, the last command returned true.

셋, $BASH_COMMAND너에게 줘해결되지 않은명령줄이므로 특별한 경우 명령줄의 첫 번째 이름이 반드시 명령 이름일 필요는 없습니다.

$ false herp derp                       # This is okay.
error: false herp derp
$ {false,herp,derp}                     # An obfuscated way to write `false blah blah`
error: {false,herp,derp}
$ cmd=false
$ $cmd herp derp                        
error: $cmd herp derp

관련 정보