Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash“-";谜题:脚本文件意外结束_Bash_Shell - Fatal编程技术网

bash“-";谜题:脚本文件意外结束

bash“-";谜题:脚本文件意外结束,bash,shell,Bash,Shell,为了清楚起见,我将缩短我的bash脚本: #!/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”,文件的结尾也会正确。 为什么会发生这种情况?bash-e表示如果命令以非零状态退出,则立即退出。

为了清楚起见,我将缩短我的bash脚本:

#!/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”,文件的结尾也会正确。

为什么会发生这种情况?

bash-e
表示如果命令以非零状态退出,则
立即退出。


0-0
的结果是
0
,因此
expr 0-0
的退出代码是
1
,Bash将立即退出。如果删除
-e
,Bash将忽略
expr 0-0的退出代码,并将执行脚本中的所有命令。

Bash-e
表示如果命令以非零状态退出,则立即退出。


0-0
的结果是
0
,因此
expr 0-0
的退出代码是
1
,Bash将立即退出。如果删除
-e
,Bash将忽略
expr 0-0的退出代码,并执行脚本中的所有命令。

这就是许多人建议不要使用
-e
选项的原因之一;非零退出代码并不总是表示错误。如果您对“代码> SET-E-/Code >的行为有多么明智和可预测的问题,请考虑通过练习,或查看表,演示BTW中不同shell实现之间的不兼容性,作为旁白,
expr
是20世纪70年代的遗物,不应该在现代脚本中使用
p_time=$((0-0))
保证能与符合1991年POSIX.2标准的每个shell一起工作,而且效率更高(因为它避免了
fork()
关闭子进程);非零退出代码并不总是表示错误。如果您对“代码> SET-E-/Code >的行为有多么明智和可预测的问题,请考虑通过练习,或查看表,演示BTW中不同shell实现之间的不兼容性,作为旁白,
expr
是20世纪70年代的遗物,不应该在现代脚本中使用
p_time=$((0-0))
保证能与符合1991年POSIX.2标准的每个shell一起工作,而且效率更高(因为它避免了
fork()
关闭子进程)。