不使用set -e
,脚本将按预期运行,并正确生成所有结果。
添加set -e
后,在此命令后退出:
./NameOfATool > result.txt
当我环绕该命令时set +e
,set -e
脚本会按预期终止。
为什么会退出,或者命令可能有什么问题?
psNameOfATool
是从 C 代码编译的可执行文件。当我手动键入该命令时,它运行正常而不会出现错误。
不使用set -e
,脚本将按预期运行,并正确生成所有结果。
添加set -e
后,在此命令后退出:
./NameOfATool > result.txt
当我环绕该命令时set +e
,set -e
脚本会按预期终止。
为什么会退出,或者命令可能有什么问题?
psNameOfATool
是从 C 代码编译的可执行文件。当我手动键入该命令时,它运行正常而不会出现错误。
set -e
如果任何命令返回非零退出状态,将导致脚本退出。(嗯,有很多例外,但这是一般规则。)所以,./NameOfATool
显然返回非零退出状态。这可能意味着它实际上认为有一个错误,或者它可能意味着程序编写得不好并且没有报告适当的成功退出状态,或者它可能意味着它使用特殊的退出状态值来报告特定的事情(很像标准实用程序diff
,它返回 0 表示“相同”,1 表示“不同”,2 表示“错误”)。
在你的陷阱中尝试 set +e :
设置-e; 陷阱'x = $?; 设置+e; 回声你好;错误的; 回声世界;22号出口;' 呃 回声测试 错误的 echo 从来没有看到这个
省略set +e
并且您看不到“世界”,因为陷阱中的非零退出代码在陷阱完成之前退出。
正如@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