트랩이 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