在 bash 中,选项“set -e”会导致立即退出,这是源脚本中的一个问题

在 bash 中,选项“set -e”会导致立即退出,这是源脚本中的一个问题

在终端中使用 bash 时,通常必须运行源脚本。在这种情况下,必须通过“return”来终止脚本,而不是通过“exit”来终止,以免杀死基本 shell。

作为普通用户,我可以以某种方式完成该选项 -e 以应用“返回”而不是“退出”。

问候

安东·韦塞尔

答案1

是的,设置errexitshell 选项set -e将使当前 shell 在命令以非零退出状态终止时立即退出(除非该命令是 AND/OR 列表等的一部分)

这意味着您不能“从外部”导致源脚本在出现第一个错误时停止执行set -e

然而,在bashshell 中发生的另一件事(当set -e本应触发时)是任何ERR陷阱都会执行。这允许我们设置一个陷阱,只执行return.

$ cat script
echo hello
false
echo bye
$ . ./script
hello
bye

我们希望上面的脚本在执行时停止执行false。我们通过为 设一个陷阱来做到这一点ERR。在使用之前,陷阱首先会自行取消设置return。如果陷阱没有自行取消设置,我们会收到来自 shell 的抱怨,抱怨尝试在return不处于函数或源脚本中的情况下运行。这是由于源脚本的非零返回状态导致陷阱第二次激活。

$ trap 'trap - ERR;return' ERR
$ . ./script
hello
$ echo "$?"
1

请注意,每次获取脚本时,我们都必须设置陷阱。

相关内容