2017-10-21 75 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的退出代碼,並執行腳本中的所有命令。