cmd && echo "$?"
将不起作用,因为它只能打印零(echo
仅在成功完成前面的命令时执行)。
这是为您提供的简短Shell函数:
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
到/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 $?
将打印卧铺细胞的代码只当它是零...