2013-07-24 43 views
26

特定錯誤我有有引發許多錯誤的可能性shell腳本的一個小片段。我已經將腳本設置爲全局停止所有錯誤。不過,我想爲這個小分節略有不同。無視Shell腳本

下面是摘錄:

recover database using backup controlfile until cancel || true; 
auto 

我期待這最終拋出「找不到文件」的錯誤。不過,我想繼續執行此錯誤。對於任何其他錯誤,我希望腳本停止。

什麼將是實現這一目標的最好方法是什麼?

猛砸版本3.00.16

+2

請問[this](http://stackoverflow.com/questions/64786/error-handling-in-bash)有幫助嗎?而且,歡迎來到SO! :) –

+0

這確實有助於改善我的錯誤報告,但它不包括處理不同莊園中的不同錯誤的任何內容。 我基本上試圖模仿c#中的try {} catch {} – Stunt

回答

60

爲了防止慶典忽略特定命令的錯誤,你可以說:

some-arbitrary-command || true 

這使腳本繼續。例如,如果您有以下腳本:

$ cat foo 
set -e 
echo 1 
some-arbitrary-command || true 
echo 2 

執行,它將返回:

$ bash foo 
1 
z: line 3: some-arbitrary-command: command not found 
2 

在命令行中沒有|| true,它會產生了:

$ bash foo 
1 
z: line 3: some-arbitrary-command: command not found 

來自manual的報價:

殼不會退出如果失敗的命令是立即在if語句 測試一個whileuntil關鍵字,部分繼 命令列表的一部分,在一個&&||列表除了執行任何命令的一部分下面的管道最終&&||,任何命令 但最後,或者命令的返回狀態正在 與!反轉的命令。上ERR陷阱,如果設置,在殼 退出之前執行。

編輯:爲了改變行爲,使得在執行應該繼續只有執行some-arbitrary-command返回file not found作爲錯誤的部分,你可以說:

[[ $(some-arbitrary-command 2>&1) =~ "file not found" ]] 

舉個例子,執行以下(名爲MissingFile.txt沒有文件存在):

$ cat foo 
#!/bin/bash 
set -u 
set -e 
foo() { 
    rm MissingFile.txt 
} 
echo 1 
[[ $(foo 2>&1) =~ "No such file" ]] 
echo 2 
$(foo) 
echo 3 

這將產生以下輸出:

$ bash foo 
1 
2 
rm: cannot remove `MissingFile.txt': No such file or directory 

注意echo 2被執行死刑,但echo 3沒有。

+0

這更像是我的「set + e和set -e」用法的替代嗎?我不知道我明白這是如何處理不同的錯誤。 – Stunt

+0

@Stunt這不是替代品。這隻意味着如果你在腳本的開頭設置了-e,你不需要說'set + e'來忽略錯誤。說'命令||真正'就夠了。 – devnull

+0

這對清理我的代碼很有幫助(set + e和set -e會變得非常混亂!)但是它仍然在更一般的基礎上處理錯誤。對於這個問題,我想檢查錯誤,然後根據拋出哪個錯誤繼續或退出。 (看不出如何投票您的評論作爲有用的!) – Stunt

17

用途:

command || : 

:是一個bash內置總是返回成功。而且,如上所述,||短路,所以只有在LHS失效時纔會執行RHS(返回非零)。

以上使用'true'的建議也可以,但效率不高,因爲'true'是外部程序。

+2

如果您運行'/ bin/true',True只是一個外部程序,因爲'true'本身就是一個內置bash的shell,就像echo和test一樣,它也作爲外部程序存在,但是也在bash中內置,如果你沒有給出完整的路徑,將使用內置插件。 – Mecki