2012-09-20 108 views
22

我有-e選項設置,從而未能在第一個錯誤腳本的整個bash腳本。如何在設置-e選項時避免bash腳本失敗?

在腳本中,我想上的目錄做一個ls。但是這條路可能存在也可能不存在。如果路徑不存在,ls命令將失敗,因爲-e標誌已設置。

有沒有辦法讓我可以阻止腳本失敗?

作爲一個方面說明,我已經嘗試過在該命令之前和之後執行set +eset -e並且它可以工作。但我正在尋找更好的解決方案。

回答

30

可以「捕獲」的錯誤使用||這樣的bash不會失敗和命令保證0狀態退出:

ls $PATH || echo "$PATH does not exist" 

由於化合物命令成功$PATH是否存在, set -e未被觸發,您的腳本不會退出。

要靜默抑制該錯誤,則可以使用true命令:

ls $PATH || true 

爲了執行多條命令,則可以使用該化合物的一種命令:

ls $PATH || { command1; command2; } 

ls $PATH || (command1; command2) 

只是要確保沒有任何複合命令內出現故障,無論是。第二個例子中的一個好處是,你可以關閉立即退出模式的殼層內而不影響當前shell的地位:

ls $PATH || (set +e; do-something-that-might-fail) 
+0

感謝您的回覆。我仍然有一些疑慮。如果'ls'命令失敗,它仍然會打印一條消息,路徑存在,所以路徑存在,是否有辦法抑制?另外,在'OR'部分,有沒有辦法執行2行代碼? – Bhushan

2

一個解決辦法是測試文件夾是否存在

function myLs() { 
    LIST="" 
    folder=$1 
    [ "x$folder" = "x" ] && folder="." 
    [ -d $folder ] && LIST=`ls $folder` 
    echo $LIST 
} 

如果$folder不存在

5

另一種選擇是使用trap趕上EXIT信號:

trap 'echo "ls failed" ; some_rescue_action' EXIT 
ls /non_exist 
相關問題