“源脚本”不支持“#!/bin/bash -ex”并在命令失败时退出

bat*_*lei 3 bash shell

在 bash 中谷歌搜索“set -e”后我感到困惑。根据我的理解,使用“set -e”,只要出现错误,bash就会退出。但是如果你在 mac 中运行下面两个简单的脚本,例如source myscript,你仍然可以看到“无法到达这里”......有什么想法吗?

#!/bin/bash -ex 
fun_with_error_code() {
  return 1;
}
fun_with_error_code
echo "can not get here"
Run Code Online (Sandbox Code Playgroud)

另一个

#!/bin/bash -ex
commandNotExit
echo "can not get here"
Run Code Online (Sandbox Code Playgroud)

我的菜鸟错误。查尔斯·达菲(Charles Duffy)的以下回答解决了这个问题。这两个脚本工作正常,只是因为“source myscript”不尊重 shebang 行。

Cha*_*ffy 6

shebang 行用于让脚本告诉操作系统使用哪个解释器来运行它。

当您使用 时source,您是在告诉当前的 shell 解释器在内部评估脚本的命令。

因此,操作系统不需要为脚本启动新的解释器。

因此,操作系统永远不会调用 shebang 行。

因此,-ex当您的脚本使用 运行时,永远不会调用该行上的参数source


解决方案有两个:

  • set -e如果您确实想要达到这种效果,请用作单独的行(但请参阅BashFAQ #105了解为什么不应该这样做的原因)。
  • source除非您有非常明确的理由在现有解释器中运行脚本(并更改该解释器的状态),否则不要使用。当你确实这样的理由时,跑步set -e几乎肯定是你不想做的事情。