次のコマンドを実行したいと思います。
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つのタールがある特別な場合には、コサロナンダの答えあらかじめ確認してみるのも良い解決策だ。