Linux
使用與第一個命令相同的參數執行第二個命令作為回退
我想執行以下命令:
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 ]
會丟棄 的值$?
,因此需要額外的變數來保存實際退出狀態。在這兩個焦油的具體情況下,庫薩蘭南達關於事先檢查的回答也是一個很好的解決方案。