2017-10-21 79 views
0

为了把事情说清楚,我想我的短bash脚本:庆典“-e”益智游戏:脚本文件结束意外

#!/bin/bash -e 

p_time=$(expr 0 - 0) 
echo ? 
echo "process time(sec) is: " ${p_time} 

之前“回声?”,但如果我改变“p_time =文件将结束$(expr 0 - 0)“改为”p_time = $(expr 3 - 0)“,文件将正确结束。
但是,如果我在第一句中删除了“-e”,则文件也会正确结束。
为什么会发生这种情况?

+1

这是很多人推荐不使用'-e'选项的原因之一;非零退出代码并不总是表示*错误*。 – chepner

+0

如果您有任何关于'set -e'的行为是否理智和可预测的问题,请考虑参加[BashFAQ#105](http://mywiki.wooledge.org/BashFAQ/105)中的练习,或者顺便说一下,在https://www.in-ulm.de/~mascheck/various/set-e/ –

+1

顺便说一下,表格显示了不同shell的实现之间的不兼容问题。另外,'expr'是1970年代的遗迹,应该不能用于现代脚本。 ''p_time = $((0 - 0))''可以保证符合1991 POSIX.2标准的每一个shell,并且* *效率更高(因为它避免了fork()从子进程中退出)。 –

回答

2

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的退出代码,并执行脚本中的所有命令。