如果一個Bash腳本有set -e
,並且腳本中的一個命令返回一個錯誤,那麼在腳本退出之前我怎麼做一些清理?如何在Bash腳本退出之前運行命令?
例如:
#!/bin/bash
set -e
mkdir /tmp/foo
# ... do stuff ...
rm -r /tmp/foo
我怎樣才能確保/tmp/foo
被刪除,即使在... do stuff ...
失敗的命令嗎?
如果一個Bash腳本有set -e
,並且腳本中的一個命令返回一個錯誤,那麼在腳本退出之前我怎麼做一些清理?如何在Bash腳本退出之前運行命令?
例如:
#!/bin/bash
set -e
mkdir /tmp/foo
# ... do stuff ...
rm -r /tmp/foo
我怎樣才能確保/tmp/foo
被刪除,即使在... do stuff ...
失敗的命令嗎?
下面是使用陷阱的例子:
#!/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]:~ $
的通知。
從set
參考:
-e
退出立即如果一個簡單的命令(見第3.2.1節簡單命令)退出時非零狀態,除非在命令失敗是until或while循環的一部分,是if語句的一部分,是& &或||的一部分。列表,或者如果命令的返回狀態正在使用!反轉。 如果設置了ERR,則會在shell退出前執行陷阱。
(Emphasis mine)。
從bash
手冊頁(關於內建):
陷阱[-lp] [[參數] SIGSPEC ...]
命令arg的要被讀取和執行時的殼 接收信號(s)sigspec。
所以,在Anon.'s answer指示,調用trap
在腳本年初成立你ERR渴望的處理程序。
你也可以在EXIT上陷阱。 – 2010-01-25 03:15:27
運行'help trap'來查看內置的一些幫助。 – Flimm 2014-02-27 13:20:43