bash “-e” puzzler: script file ended unexpectedly
为了清楚起见,我将缩短bash脚本:
1 2 3 4 5
| #!/bin/bash -e
p_time=$(expr 0 - 0)
echo ?
echo"process time(sec) is:" ${p_time} |
该文件将在" echo?"之前结束,但是如果我将" p_time = $(expr 0-0)"更改为" p_time = $(expr 3-0)",该文件将正确结束。
但是,如果我在第一句中删除了"-e ",那么文件也正确地结束了。
为什么会这样?
- 这就是为什么许多人建议不使用-e选项的原因之一;非零退出代码并不总是表示错误。
-
如果您对set -e的行为如何合理和可预测有任何疑问,请考虑通过BashFAQ#105中的练习,或在in-ulm.de/~mascheck上查看表以证明不同Shell的实现之间的不兼容性。 / variable / set-e
-
顺便说一句,expr是1970年代的遗物,不应在现代脚本中使用。保证p_time=$((0 - 0))可以与所有符合1991 POSIX.2标准的shell一起使用,并且效率更高(因为它避免了fork()取消子进程)。
bash -e表示Exit immediately if a command exits with a non-zero status.
0 - 0的结果为0,因此expr 0 - 0的退出代码为1,Bash将立即退出。如果删除-e,则Bash将忽略expr 0 - 0的退出代码,并将执行脚本中的所有命令。