Shell
使用 $ 的最佳實踐?在重擊中?
當我讀到這個關於 $? 的答案時 另一個問題浮現在腦海。
有沒有關於如何使用 $ 的最佳實踐?在重擊中?
讓我們舉個例子:
我們有一個線性腳本,我想知道所有命令都執行正常。你認為呼叫一個小函式(我們稱之為“did_it_work”)來檢查錯誤程式碼是否可以,如果不是則中斷。
#!/bin/bash function did_it_work { code=$1 if [ "$code" -ne "0" ] then echo "Error failure: code $code " exit 1 fi } dir=some/path mkdir -p $dir did_it_work $? cd $dir did_it_work $? run_some_command did_it_work $?
這種方法當然意味著我必須手動解決問題(如果有的話)並重新執行腳本。
您認為這是一個好主意還是有其他最佳做法可以做到這一點?
/謝謝
一種常見的方法是:
die() { IFS=' ' # make sure "$*" is joined with spaces # output the arguments if any on stderr: [ "$#" -eq 0 ] || printf '%s\n' "$*" 1>&2 exit 1 }
然後你像這樣使用它:
mkdir -p some/path || die "mkdir failed with status $?"
或者,如果您希望它包含退出狀態,您可以將其更改為:
die() { last_exit_status=$? IFS=' ' printf '%s\n' "FATAL ERROR: $* (status $last_exit_status)" 1>&2 exit 1 }
然後使用它會更容易一些:
mkdir -p some/path || die "mkdir failed"
當它失敗時,
mkdir
很可能已經發出了一條錯誤消息,因此第二個可能被視為多餘的,您可以這樣做:mkdir -p some/path || exit # with the same (failing) exit status as mkdir's mkdir -p some/path || exit 1 # with exit status 1 always
(或使用
die
上面的第一個變體沒有參數)以防萬一你以前沒見過
command1 || command2
,它執行command1
,如果command1
失敗,它執行command2
。因此,您可以像“製作目錄或死亡”一樣閱讀它。
您的範例如下所示:
mkdir -p some/path || die "mkdir failed" cd some/path || die "cd failed" some_command || die "some_command failed"
或者您可以將
dies
右側的更遠對齊,以便主程式碼更明顯。mkdir -p some/path || die "mkdir failed" cd some/path || die "cd failed" some_command || die "some_command failed"
或者當命令行很長時在以下行:
mkdir -p some/path || die "mkdir failed" cd some/path || die "cd failed" some_command || die "some_command failed"
此外,如果您要
some/path
多次使用該名稱,請將其儲存在一個變數中,這樣您就不必繼續輸入它,並且可以在需要時輕鬆更改它。並且在將變數參數傳遞給命令時,請確保使用--
選項分隔符,以便如果參數以-
.dir=some/path mkdir -p -- "$dir" || die "Cannot make $dir" cd -P -- "$dir" || die "Cannot cd to $dir" some_command || die "Cannot run some_command"