不使用“set -e”,脚本按预期运行,并正确生成所有结果。
添加“set -e”后,它将在此命令后退出:
./NameOfATool > result.txt
当我在该命令周围包装'set + e'和'set -e'时,脚本终止正常。
问题是,为什么它会退出,或者命令可能出错?
P.S。 'NameOfATool'是从c代码编译的可执行文件。当我手动输入该命令时,它运行正常而不会出错。
谢谢大家!
答案 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