cmd && echo "$?"
필연적으로 0을 인쇄하기 때문에 작동하지 않습니다 ( echo
이전 명령을 성공적으로 완료하면 실행됩니다).
짧은 쉘 기능은 다음과 같습니다.
tellexit () {
"$@"
local err="$?"
printf 'exit code\t%d\n' "$err" >/dev/tty
return "$err"
}
이것은 명령과 유사한 방식으로 주어진 명령의 종료 코드를 인쇄합니다 time
.
$ tellexit echo "hello world"
hello world
exit code 0
$ tellexit false
exit code 1
함수 에서 printf
to 를 리디렉션하면 표준 출력 또는 오류 스트림에 정크가 없어도 리디렉션과 함께 /dev/tty
계속 사용할 수 있습니다 tellexit
.
$ tellexit bash -c 'echo hello; echo world >&2' >out 2>err
exit code 0
$ cat out
hello
$ cat err
world
종료 코드를 변수에 저장하여 호출자에게 반환 할 수 있습니다.
$ tellexit false || echo 'failed'
exit code 1
failed
동일한 기능의 더 멋진 버전은 종료 코드가 128보다 큰 경우 명령을 종료 한 신호를 출력합니다 (신호로 인해 종료됨을 의미 함).
tellexit () {
"$@"
local err="$?"
if [ "$err" -gt 128 ]; then
printf 'exit code\t%d (%s)\n' "$err" "$(kill -l "$err")" >/dev/tty
else
printf 'exit code\t%d\n' "$err" >/dev/tty
fi
return "$err"
}
테스트 :
$ tellexit sh -c 'kill $$'
exit code 143 (TERM)
$ tellexit sh -c 'kill -9 $$'
Killed
exit code 137 (KILL)
( / / / /이 local
필요 하거나 다른 쉘도 이해할 수 있도록 변경할 수 있습니다 .)ash
pdksh
bash
zsh
typeset
sleep 1 && echo $?
그것은 ... 제로 때만자는 세포의 코드를 인쇄 할 것이다