bash“-";谜题:脚本文件意外结束
为了清楚起见,我将缩短我的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表示如果命令以非零状态退出,则立即退出。
#!/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()
关闭子进程)。