Shell

使用 $ 的最佳實踐?在重擊中?

  • June 19, 2019

當我讀到這個關於 $? 的答案時 另一個問題浮現在腦海。

有沒有關於如何使用 $ 的最佳實踐?在重擊中?


讓我們舉個例子:

我們有一個線性腳本,我想知道所有命令都執行正常。你認為呼叫一個小函式(我們稱之為“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"

引用自:https://unix.stackexchange.com/questions/8759