私の変数に引用符で囲まれたglobが含まれていて、二重引用符を使わずに拡張​​した場合、globが消えるのはなぜですか?

私の変数に引用符で囲まれたglobが含まれていて、二重引用符を使わずに拡張​​した場合、globが消えるのはなぜですか?

引用符で囲まれていない文字列拡張を使用して、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 "$@"

おすすめ記事