特定錯誤我有有引發許多錯誤的可能性shell腳本的一個小片段。我已經將腳本設置爲全局停止所有錯誤。不過,我想爲這個小分節略有不同。無視Shell腳本
下面是摘錄:
recover database using backup controlfile until cancel || true;
auto
我期待這最終拋出「找不到文件」的錯誤。不過,我想繼續執行此錯誤。對於任何其他錯誤,我希望腳本停止。
什麼將是實現這一目標的最好方法是什麼?
猛砸版本3.00.16
特定錯誤我有有引發許多錯誤的可能性shell腳本的一個小片段。我已經將腳本設置爲全局停止所有錯誤。不過,我想爲這個小分節略有不同。無視Shell腳本
下面是摘錄:
recover database using backup controlfile until cancel || true;
auto
我期待這最終拋出「找不到文件」的錯誤。不過,我想繼續執行此錯誤。對於任何其他錯誤,我希望腳本停止。
什麼將是實現這一目標的最好方法是什麼?
猛砸版本3.00.16
爲了防止慶典忽略特定命令的錯誤,你可以說:
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
語句 測試一個while
或until
關鍵字,部分繼 命令列表的一部分,在一個&&
或||
列表除了執行任何命令的一部分下面的管道最終&&
或||
,任何命令 但最後,或者命令的返回狀態正在 與!
反轉的命令。上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
沒有。
用途:
command || :
:是一個bash內置總是返回成功。而且,如上所述,||短路,所以只有在LHS失效時纔會執行RHS(返回非零)。
以上使用'true'的建議也可以,但效率不高,因爲'true'是外部程序。
如果您運行'/ bin/true',True只是一個外部程序,因爲'true'本身就是一個內置bash的shell,就像echo和test一樣,它也作爲外部程序存在,但是也在bash中內置,如果你沒有給出完整的路徑,將使用內置插件。 – Mecki
請問[this](http://stackoverflow.com/questions/64786/error-handling-in-bash)有幫助嗎?而且,歡迎來到SO! :) –
這確實有助於改善我的錯誤報告,但它不包括處理不同莊園中的不同錯誤的任何內容。 我基本上試圖模仿c#中的try {} catch {} – Stunt