引用符で囲まれていない文字列拡張を使用して、tarに2つの引数を渡そうとします。最初の引数はコマンドラインフラグ--exclude
で、2番目の引数には*
文字が含まれています。早期ワイルドカードを避けるために、以下を引用してみました*
。
shopt -s nullglob
x="--exclude '*'"
echo tar $x
驚いたことに'*'
完全に消えた!出力は次のとおりです。
tar --exclude
POSIXシェルからBashに切り替えて配列を使用すると、この問題を回避できることがわかります。しかし、私はまだ知りたいです。 POSIXシェルの彫刻に一体何が起こっているのでしょうか?参照されたglobを削除するのはなぜですか?引用された部分をそのまま維持するか、ずっと拡張してグローバルに拡張すると考えたはずです。しかし、どちらもそうではありません。
ベストアンサー1
まず、すでに使用しているオプション、bash
または少なくともPOSIX以外のオプションの一部を使用しています。 (POSIXも同様shopt
ですnullglob
。)
今何が起こっているのか説明しましょう。
x="--exclude '*'"
echo tar $x
この変数は$x
空白をトークン化し、結果部分をグロービングに使用します。--exclude
ワイルドカードはなく、そのまま残ります。'*'
一致するものはありません(ファイル名が文字通り単一引用符で始まり、終わらない限り)。ワイルドカードが含まれていてnullglob
削除するように設定したためです。明らかにする
tar --exclude
すでに使っていますので、bash
一度使ってみるのもいいようです。
x=('--exclude' '*')
echo tar "${x[@]}"
POSIXソリューションが必要な場合は、私が提供できる最善の方法は、デフォルトのパラメータリストを再利用することです。
set -- '--exclude' '*'
echo tar "$@"