bash - 在具有退出陷阱的脚本出现 shell 错误的情况下将退出代码传播给调用者

标签 bash exit-code bash-trap

在带有 EXIT 陷阱的 Bash 脚本中出现语法错误时,是否可以将退出代码传播给调用者?例如,如果我有:

#! /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)替换带有未绑定(bind)变量的行,那么退出值按照我的意愿传播。

最佳答案

shell 以最后执行命令的结果退出。在您的陷阱案例中,这是 echo,通常会成功返回。

要传播您的值(value),只需退出即可。

#!/bin/bash

set -eu

die() {
  echo "Dying!!"
  exit "$1"
}

trap 'die $?' EXIT

echo yeah
echo $unbound
echo boo

另请注意,set -e 被认为是有害的——它会让您认为脚本将在命令失败时退出,但它并不总是如此。

关于bash - 在具有退出陷阱的脚本出现 shell 错误的情况下将退出代码传播给调用者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25064292/

相关文章:

bash - 停止回显 ^C 到终端

bash - 尝试将 csv 导入 sqlite 数据库失败并出现错误 - 预期 9 列,但发现 1 - 用 NULL 填充其余部分

powershell - 为什么Powershell在Windows 7上不返回ExitCode

bash - 从子 shell 返回值并输出到局部变量

Bash 陷阱,捕获并将它们作为同一函数的参数传递

bash - Cloudinit是否可以用于自动化复杂的配置,例如UFW和Apache

shell - 捕获 shell 退出代码

bash - 如何通过一组脚本传播信号?

Bash,评估中的 CTRL+C 不会中断主脚本

bash - 如何输出 Bash 函数的每个参数?