如果存在退出陷阱的脚本出现 shell 错误,则将退出代码传播给调用者

StackOverflow https://stackoverflow.com//questions/25064292

  •  23-12-2019
  •  | 
  •  

如果 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 被认为是有害的——它让你认为如果命令失败脚本就会退出,但事实并非总是如此。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top