Bash中export忽略set -ex:为何cat foo不存在时未终止执行?
为啥带export时
cat foo(foo不存在)不会终止程序? 哈哈,这个问题我之前也碰到过,核心其实和Bash的set -e(也就是errexit选项)以及export命令的特殊逻辑有关,我给你掰扯清楚:
首先得假设你的脚本开了set -e——这个选项的作用就是只要有命令跑失败(返回非零退出码),脚本立刻终止。要是没开这个选项,两种情况的行为不会有区别,这点是前提哈。
两种情况的本质差异
没加export的场景:
直接跑cat foo,foo不存在的话,cat肯定返回非零(一般是1)。这时候set -e触发,脚本直接停了,后面的代码都不执行,看起来就是“正常失败终止”。加了export的场景:
我估摸着你的代码应该是export $(cat foo)这种写法——把cat foo的输出当成export的参数。这时候流程是这样的:cat foo确实失败了,但命令替换$(cat foo)会把这个失败的输出变成空字符串;export命令拿到空参数的时候,不会做任何变量导出操作,反而返回0(成功状态);- 因为
export的退出码是0,set -e就不会触发终止逻辑,脚本接着往下跑,看起来就像cat foo的失败没影响程序似的。
你可以自己验证下
在脚本里加两行看退出码的命令就清楚了:
set -e export $(cat foo) echo "export的退出码:$?" # 这里会输出0,证明export是成功的 cat foo echo "cat的退出码:$?" # 这行根本不会执行,因为cat失败直接触发set -e终止了
要是你的代码不是export $(cat foo),而是export; cat foo这种分开的命令,那cat foo失败还是会让脚本终止——所以关键就是export处理空参数时的退出码特性。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

