代替コマンドとして、最初のコマンドと同じパラメーターを使用して2番目のコマンドを実行します。

代替コマンドとして、最初のコマンドと同じパラメーターを使用して2番目のコマンドを実行します。

次のコマンドを実行したいと思います。

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フォールバックで、1行でパラメータを一度だけ書き込むことができますか?

ベストアンサー1

まず、gtarを呼び出してから、代替手段としてtarを1行で呼び出して、パラメータを一度だけ書くことはできますか?

この質問に答えるには:これは、パラメータを配列に格納する簡単な実装で行うことができます。 (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

または、次のように主張する場合は、1行で:

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

これは説明できませんが、なぜ問題がアクセスできないディレクトリに似ていても、失敗して別のtarで再試行します。

別のオプションは、最初のコマンドで「コマンドが見つかりません」エラーが発生した場合にコマンドを再実行することです。$?この場合、シェルは通常127に設定されます。もちろん、これはおそらく何らかの形で存在するので、gtar最初に反転する必要があります。tar

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

テストでは[ "$? = 127 ]値が削除されるため、$?実際の終了状態を維持するには追加の変数が必要です。

2つのタールがある特別な場合には、コサロナンダの答えあらかじめ確認してみるのも良い解決策だ。

おすすめ記事