如果存在退出陷阱的脚本出现 shell 错误,则将退出代码传播给调用者
题
如果 Bash 脚本中存在带有 EXIT 陷阱的语法错误,是否可以将退出代码传播给调用者?例如,如果我有:
#! /bin/bash
set -eu
trap "echo dying!!" EXIT
echo yeah
echo $UNBOUND_VARIABLE
echo boo
然后,即使脚本没有真正成功结束,运行它也会给出退出代码 0:
$ bash test.sh
yeah
test.sh: line 8: UNBOUND_VARIABLE: unbound variable
dying!!
$ echo $?
0
但如果我注释掉退出陷阱,脚本将返回 1。或者,如果我用返回非零的命令替换带有未绑定变量的行(例如 /bin/false
),该退出值按照我的意愿传播。
解决方案 2
此行为与不同的Bash版本有关。原始脚本在Bash 4.2上的预期工作,但不是3.2。在单独的脚本文件中具有错误易于代码,并在子Shell中运行它在早期的Bash版本中的问题周围:
#!/bin/bash
$BASH sub.sh
RETVAL=$?
if [[ "$RETVAL" != "0" ]]; then
echo "Dying!! Exit code: $RETVAL"
fi
.
sub.sh:
set -eu
echo yeah
echo $UNBOUND_VARIABLE
echo boo
. 其他提示
shell 退出并显示最后执行命令的结果。在你的陷阱案例中,那就是 echo
, ,通常会成功返回。
为了传播你的价值,只需 exit
用它。
#!/bin/bash
set -eu
die() {
echo "Dying!!"
exit "$1"
}
trap 'die $?' EXIT
echo yeah
echo $unbound
echo boo
另请注意 set -e
被认为是有害的——它让你认为如果命令失败脚本就会退出,但事实并非总是如此。
不隶属于 StackOverflow