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

时间:2018-03-03 04:12:57

标签: 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"

另一个

#!/bin/bash -ex
commandNotExit
echo "can not get here"

我的菜鸟错误。 Charles Duffy在下面的回答解决了这个问题。这两个脚本工作正常,这只是因为“源myscript”并不尊重shebang line。

1 个答案:

答案 0 :(得分:2)

shebang行用于让脚本告诉操作系统运行它的解释器。

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

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

因此,操作系统从不调用shebang线。

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

解决方案有两个方面:

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