Linux

使用與第一個命令相同的參數執行第二個命令作為回退

  • September 20, 2021

我想執行以下命令:

tar  --sort=name --owner=root:0 --group=root:0 --mtime='UTC 2020-01-01' -cvf api.tar api

但是對於 macOS 需要以下備份:

gtar --sort=name --owner=root:0 --group=root:0 --mtime='UTC 2020-01-01' -cvf api.tar api

(注意:論點是相同的。)

我可以gtar先打電話,然後tar作為備份,作為單線,只寫一次論點嗎?

我可以先呼叫 gtar,然後將 tar 作為備份,作為單線,只寫一次參數嗎?

按照要求回答這個問題:這可以作為將參數儲存在數組中的簡單實現來完成。(Bash/ksh/zsh。有關問題和與 POSIX 兼容的解決方法,請參閱我們如何執行儲存在變數中的命令? )

args=(--sort=name --owner=root:0 --group=root:0 --mtime='UTC 2020-01-01' -cvf api.tar api)
if ! tar "${args[@]}"; then
   echo "using 'tar' failed, retrying with 'gtar'" >&1
   gtar "${args[@]}"
fi

或作為單線,如果您堅持:

tar "${args[@]}" || gtar "${args[@]}"

儘管這並不能說明它失敗的原因,並且即使問題類似於不可訪問的目錄,也會嘗試使用其他 tar 重試。

另一種選擇是僅在第一個錯誤出現“找不到命令”時才重新執行該命令。在這種情況下,shell 通常設置$?為 127。當然,這需要gtar先翻轉,因為tar可能以某種形式存在。

gtar "${args[@]}"
ret=$?
if [ "$ret" = 127 ]; then
   tar "${args[@]}"
   ret=$?
fi

測試[ "$? = 127 ]會丟棄 的值$?,因此需要額外的變數來保存實際退出狀態。

在這兩個焦油的具體情況下,庫薩蘭南達關於事先檢查的回答也是一個很好的解決方案。

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