2012-08-28 48 views
2

語境:給定一個主函數和一個清理函數,如何(規範地)在Bash/Linux中返回退出狀態?

我有一個bash腳本(用於其他腳本的包裝,真的),這不下面的僞代碼:

問題
do a main function 
if the main function returns: 
    $returncode = $? #most recent return code 
if the main function runs longer than a timeout: 
    kill the main function 
    $returncode = 140 #the semi-canonical "exceeded allowed wall clock time" status 

run a cleanup function 
if the cleanup function returns an error: #nonzero return code 
    exit $? #exit the program with the status returned from the cleanup function 
else #cleanup was successful 
    .... 

應該發生什麼後

最後一行?

如果清理函數成功,但主函數不成功,我的程序應該返回0(用於成功清理)還是$returncode,它包含主函數的返回碼(可能爲非零和不成功)?

對於特定的應用程序,答案很簡單:「這取決於您需要的腳本。」但是,這更多的是一個普遍的/規範的問題(如果這是錯誤的地方,用它殺死它):在Bash(或者一般的Linux)編程中,你通常希望返回狀態那「意味着」某事(即$returncode)或者你忽略了這種主觀性,並簡單地返回最近函數的代碼?

這不是Bash特有的:如果我有任何類型的獨立可執行文件,規範它應該在這些情況下表現嗎?顯然,這有些值得商榷。即使有這樣的系統,我相信很多人都會忽略它。儘管如此,我想知道。

乾杯!

回答

4

從main返回退出代碼。作爲腳本的用戶,我想知道它是否完成了它的工作,而不是在失敗後是否清理完畢。實際上,我認爲程序/腳本在失敗時可以正確清理,因此返回0會導致誤解。

懶洋洋地寫的腳本只是返回他們最後一個命令碰巧擁有的任何退出代碼。寫得很好的人一定會返回一個有意義的退出代碼。


順便說一句,我最喜歡的方式,以確保適當的清理是對trap EXIT運行清理功能。

WORKING_DIR=$(mktemp -d) 

cleanUp() { 
    rm -rf "$WORKING_DIR" 
} 

# Run cleanUp() when the script exits, whether that's from a SIGTERM/SIGINT or 
# just exiting normally. 
trap cleanUp EXIT 
+0

儘管在某些版本的Bash中,EXIT僞信號不管理TERM和/或INT事件。最安全的是做一個'陷阱清理INT TERM EXIT' –

相關問題