2010-01-25 194 views
85

如果一個Bash腳本有set -e,並且腳本中的一個命令返回一個錯誤,那麼在腳本退出之前我怎麼做一些清理?如何在Bash腳本退出之前運行命令?

例如:

#!/bin/bash 
set -e 
mkdir /tmp/foo 
# ... do stuff ... 
rm -r /tmp/foo 

我怎樣才能確保/tmp/foo被刪除,即使在... do stuff ...失敗的命令嗎?

回答

131

下面是使用陷阱的例子:

#!/bin/bash 
set -e 
function cleanup { 
    echo "Removing /tmp/foo" 
    rm -r /tmp/foo 
} 
trap cleanup EXIT 
mkdir /tmp/foo 
asdffdsa #Fails 

輸出:即,即使asdffdsa線失敗,清理仍然被執行

[email protected]:~ $ sh traptest 
t: line 9: asdffdsa: command not found 
Removing /tmp/foo 
[email protected]:~ $ 

的通知。

5

set參考:

-e

退出立即如果一個簡單的命令(見第3.2.1節簡單命令)退出時非零狀態,除非在命令失敗是until或while循環的一部分,是if語句的一部分,是& &或||的一部分。列表,或者如果命令的返回狀態正在使用!反轉。 如果設置了ERR,則會在shell退出前執行陷阱。

(Emphasis mine)。

9

bash手冊頁(關於內建):

陷阱[-lp] [[參數] SIGSPEC ...]
命令arg的要被讀取和執行時的殼 接收信號(s)sigspec。

所以,在Anon.'s answer指示,調用trap在腳本年初成立你ERR渴望的處理程序。

+3

你也可以在EXIT上陷阱。 – 2010-01-25 03:15:27

+0

運行'help trap'來查看內置的一些幫助。 – Flimm 2014-02-27 13:20:43

6

這裏是一個reference爲您捕捉信號和設置-e相關。看一看。

+0

這正是我在尋找的謝謝。 – nelaaro 2017-11-03 14:18:28

相關問題