我有一個bash腳本,它監視上傳的目錄。當它在目錄中看到一個xml文件時。腳本獲取文件並調用一個使用xslt轉換文件的java命令行程序。如果腳本或java命令行程序在處理期間引發錯誤,我想將文件mv到不同的目錄(錯誤)。然後給我發電子郵件錯誤。基於shell腳本錯誤的條件操作
我打算把 EXEC 2>郵件-S「語句錯誤處理」
的腳本來捕獲輸出標準錯誤的頂部。但是這看起來不太優雅,並且不會移動有問題的文件。
我有一個bash腳本,它監視上傳的目錄。當它在目錄中看到一個xml文件時。腳本獲取文件並調用一個使用xslt轉換文件的java命令行程序。如果腳本或java命令行程序在處理期間引發錯誤,我想將文件mv到不同的目錄(錯誤)。然後給我發電子郵件錯誤。基於shell腳本錯誤的條件操作
我打算把 EXEC 2>郵件-S「語句錯誤處理」
的腳本來捕獲輸出標準錯誤的頂部。但是這看起來不太優雅,並且不會移動有問題的文件。
你可以在bash陷阱錯誤條件(即返回非零條件未辦理任何內嵌語句):
trap func ERR
然後在FUNC(函數定義),你可以做任何你需要清理。
例如:
#!/bin/bash
function foo() {
echo "cleaning up"
}
trap foo ERR
echo "about to execute false"
false
echo "exiting"
運行,這將導致:
./foo.sh
about to execute false
cleaning up
exiting
你需要兩樣東西在這裏。首先,確定程序是否失敗。這通常由程序的main()
函數的返回值知道。如果該程序返回任何不同於0的值,則會出現錯誤。
在任何情況下,您必須做的第二件事是將標準錯誤輸出捕獲到文件中以便稍後將其發送。所以:
if ! program inputfile 2> errorfile ; then
mv inputfile error_directory
mail -s "error" < errorfile
fi
rm errorfile
但是,如果你的程序遵循這個約定來表示錯誤,你必須檢查。
'test'不應該是字面值。該程序應該在'!'關鍵字後面直接調用,不涉及'test'內建工具。 – jilles 2010-10-22 22:13:47
糟糕。你是對的。糾正。謝謝! – 2010-10-22 22:34:54
如果只有一個命令檢查,'ERR'陷阱或'set -e'似乎並不有益;-) – jilles 2010-10-22 22:21:05