bash set -e在看似无错误的命令之后退出

时间:2013-08-04 18:39:22

标签: bash

不使用“set -e”,脚本按预期运行,并正确生成所有结果。

添加“set -e”后,它将在此命令后退出:

./NameOfATool > result.txt

当我在该命令周围包装'set + e'和'set -e'时,脚本终止正常。

问题是,为什么它会退出,或者命令可能出错?

P.S。 'NameOfATool'是从c代码编译的可执行文件。当我手动输入该命令时,它运行正常而不会出错。

谢谢大家!

3 个答案:

答案 0 :(得分:2)

如果任何命令返回非零退出状态,

set -e将导致脚本退出。 (好吧,有一堆例外,但这是一般规则。)因此,./NameOfATool显然会返回非零退出状态。这可能意味着它实际上认为存在错误,或者可能意味着程序写得不好并且没有报告成功的适当退出状态,或者它可能意味着它使用特殊的退出状态值来报告特定的事情(与标准实用程序diff非常相似,它为“相同”返回0,为“不同”返回1,为“错误”返回2。

答案 1 :(得分:1)

在陷阱中尝试设置+ e:

set -e;

trap 'set +e; echo Hello; false; echo World; exit 22;' ERR

echo Testing
false
echo Never See This

忽略此set +e并且在陷阱完成之前,您没有看到World作为陷阱中的非零退出代码。

答案 2 :(得分:1)

正如@ruakh所说,这表明该工具正以非零(=错误)状态退出。您可以通过将脚本放在始终成功的复合命令中来阻止它退出脚本:

./NameOfATool > result.txt || true

如果工具以非零状态退出,它将运行true,这会成功;因此,整个复合命令被认为是成功的。如果命令的退出状态很重要(即您需要能够判断它是否以状态0,1或2退出),您可以记录它以供以后使用:

./NameOfATool > result.txt && toolStatus=0 || toolStatus=$?

...或直接使用状态:

if ./NameOfATool > result.txt; then
    # do things appropriate for exit status = 0
else
    toolStatus=$?
    # do things appropriate for exit status != 0
fi