2017-08-09 20 views
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之前退出。當且僅當第一個命令失敗時,通常可以使用運算符||運行另一個命令。也就是說,我會懷疑下列打印出兩個onethree,但現在two

set -e # Exit on error 
fun(){ 
    echo one 
    non_existing_command 
    echo two 
} 
fun || echo three 

我能得到什麼但是是onetwo。也就是說,||運算符阻止退出(它應該),但它選擇繼續使用函數體並忽略右側命令。

任何解釋?

+4

查看https://unix.stackexchange.com/questions/65532/why-does-set-e-not-work-inside。 TL; DR:設置-e的POSIX規範基本上被破壞了,並且你沒有希望每一個都使它與被檢查的函數一起工作,而不會導致運行時性能損失或超出POSIX限制(並且我知道沒有非標準shell功能允許設置-e在檢查的上下文中上下文無關)。 – PSkocik

+0

所以解決方案是使用&&或將set -e函數提取到單獨的腳本或避免檢查的上下文。 – PSkocik

+0

[Bash:正確處理錯誤]的可能重複(https://stackoverflow.com/questions/45398613/bash-proper-handling-of-errors) – PSkocik

回答

4

它出現在the set builtin command

加以記錄如果化合物命令或殼函數在-e被忽略[諸如在||的左側]一個上下文中執行,沒有一個即使已設置-e並且命令返回故障狀態,複合命令或功能體內執行的命令也會受到-e設置的影響。

強調和評論是我的。

另外,如果你嘗試set -e功能中,不打擾:下一句:

如果一個複合命令或shell函數設置-e而在-e被忽視的上下文中執行,即除非複合命令或包含函數調用的命令完成,否則設置將不起作用。