2010-12-17 58 views
6

我目前想知道如何對鏈接命令進行錯誤處理。下面就是一個例子來簡單的證明我的問題:在bash腳本中使用鏈接命令(管道)進行錯誤處理?

cat file | gzip >/tmp/test 

如果失敗(例如因爲文件丟失),的gzip仍然執行因此最後存儲的退出代碼$?是。 set -e在這種情況下也無濟於事。

我想知道最佳解決方案是什麼?

謝謝!

+0

你試過'$ PIPESTATUS'嗎?它應該爲bash工作。 – khachik 2010-12-17 16:11:48

+0

我甚至不知道,這是存在的。謝謝! – aurora 2010-12-20 09:07:49

回答

8

試試這個:

trap 'echo "ERR caught"' ERR 
set -o pipefail 
cat file | gzip >/tmp/test 

輸出文件仍將被創建(創建並行完成)和gzip將運行,但你可以做清理工作。使用${PIPESTATUS[@]}數組查看發生錯誤的位置。您可以使用$BASH_COMMAND$BASH_LINENO獲取有關錯誤的其他信息。

+0

哇 - 非常酷。我不知道這種可能性。非常感謝! – aurora 2010-12-20 09:07:14