4
如果我將set -e
放在Bash腳本中,腳本將在將來出錯時退出。我很困惑這是如何與函數一起工作的。考慮下面的,這將只打印one
到標準輸出:使用||的Bash控制流on功能,設置-e
set -e # Exit on error
fun(){
echo one
non_existing_command
echo two
}
fun
顯然,non_existing_command
是錯誤的,因此該腳本的第二echo
之前退出。當且僅當第一個命令失敗時,通常可以使用或運算符||
運行另一個命令。也就是說,我會懷疑下列打印出兩個one
和three
,但現在two
:
set -e # Exit on error
fun(){
echo one
non_existing_command
echo two
}
fun || echo three
我能得到什麼但是是one
和two
。也就是說,||
運算符阻止退出(它應該),但它選擇繼續使用函數體並忽略右側命令。
任何解釋?
查看https://unix.stackexchange.com/questions/65532/why-does-set-e-not-work-inside。 TL; DR:設置-e的POSIX規範基本上被破壞了,並且你沒有希望每一個都使它與被檢查的函數一起工作,而不會導致運行時性能損失或超出POSIX限制(並且我知道沒有非標準shell功能允許設置-e在檢查的上下文中上下文無關)。 – PSkocik
所以解決方案是使用&&或將set -e函數提取到單獨的腳本或避免檢查的上下文。 – PSkocik
[Bash:正確處理錯誤]的可能重複(https://stackoverflow.com/questions/45398613/bash-proper-handling-of-errors) – PSkocik