我有-e
選項設置,從而未能在第一個錯誤腳本的整個bash腳本。如何在設置-e選項時避免bash腳本失敗?
在腳本中,我想上的目錄做一個ls
。但是這條路可能存在也可能不存在。如果路徑不存在,ls
命令將失敗,因爲-e
標誌已設置。
有沒有辦法讓我可以阻止腳本失敗?
作爲一個方面說明,我已經嘗試過在該命令之前和之後執行set +e
和set -e
並且它可以工作。但我正在尋找更好的解決方案。
我有-e
選項設置,從而未能在第一個錯誤腳本的整個bash腳本。如何在設置-e選項時避免bash腳本失敗?
在腳本中,我想上的目錄做一個ls
。但是這條路可能存在也可能不存在。如果路徑不存在,ls
命令將失敗,因爲-e
標誌已設置。
有沒有辦法讓我可以阻止腳本失敗?
作爲一個方面說明,我已經嘗試過在該命令之前和之後執行set +e
和set -e
並且它可以工作。但我正在尋找更好的解決方案。
可以「捕獲」的錯誤使用||
這樣的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)
一個解決辦法是測試文件夾是否存在
function myLs() {
LIST=""
folder=$1
[ "x$folder" = "x" ] && folder="."
[ -d $folder ] && LIST=`ls $folder`
echo $LIST
}
如果$folder
不存在
另一種選擇是使用trap
趕上EXIT
信號:
trap 'echo "ls failed" ; some_rescue_action' EXIT
ls /non_exist
感謝您的回覆。我仍然有一些疑慮。如果'ls'命令失敗,它仍然會打印一條消息,路徑存在,所以路徑存在,是否有辦法抑制?另外,在'OR'部分,有沒有辦法執行2行代碼? – Bhushan