2008-12-16 53 views
14

我目前使用此函數來包裝執行命令並記錄它們的執行並返回代碼,並在非零返回代碼的情況下退出。什麼是編寫運行命令並記錄退出代碼的包裝函數的最佳方式

但是,這是有問題的,因爲顯然它會進行雙重插值,使得帶有單引號或雙引號的命令會破壞腳本。

你能推薦一個更好的方法嗎?

這裏的功能:

do_cmd() 
{ 
    eval $* 
    if [[ $? -eq 0 ]] 
    then 
     echo "Successfully ran [ $1 ]" 
    else 
     echo "Error: Command [ $1 ] returned $?" 
     exit $? 
    fi 
} 

回答

19
"[email protected]" 

http://www.gnu.org/software/bash/manual/bashref.html#Special-Parameters

@

擴展爲位置參數,從1開始。當在雙引號內出現 擴展時,每個參數都會擴展爲單獨的單詞 。也就是說,「$ @」相當於「$ 1」「$ 2」....如果 雙引號擴展出現在一個單詞內,則將 第一個參數的擴展連接到原始單詞 的開頭部分,並且最後一個參數的擴展與原始單詞的最後一個 部分連接。當沒有位置參數時, 「$ @」和$ @展開爲空(即,它們被移除)。

這意味着參數中的空格被正確地重新引用。

do_cmd() 
{ 
    "[email protected]" 
    ret=$? 
    if [[ $ret -eq 0 ]] 
    then 
     echo "Successfully ran [ [email protected] ]" 
    else 
     echo "Error: Command [ [email protected] ] returned $ret" 
     exit $ret 
    fi 
} 
+0

不錯。在時間打我:p – 2008-12-16 18:05:55

5

附加"[email protected]"什麼道格拉斯說,我會用

return $? 

而且不exit。它會退出你的shell而不是從函數返回。如果在情況下,你想退出你的shell如果出事了,你可以做,在調用者:

do_cmd false i will fail executing || exit 
# commands in a row. exit as soon as the first fails 
do_cmd one && do_cmd && two && do_cmd three || exit 

(這樣的話,你可以處理故障,然後退出正常)。

相關問題