bashが.*を現在のディレクトリの隠しファイルのリストに変換するのはなぜですか。

bashが.*を現在のディレクトリの隠しファイルのリストに変換するのはなぜですか。
# list=(`echo ".*"`)
# for item in ${list[@]}; do echo "$item"; done;
.
..
.DS_Store
.git
.gitignore
.tox
.toxrc

上記のコードでは、bashの配列に文字列を書き込もうとしていますが、そうすると、 " .*. *"は現在のディレクトリにあるファイル/ディレクトリの完全なリストに変換されます。 Bashがこれを行うのをどのように防ぐことができますか?

答え1

list=(`echo ".*"`)

上記ではコマンド置換に引用符がないため、生成された出力には単語の区切りとワイルドカードが適用されます。

for item in ${list[@]}; do echo "$item"; done;

${list[@]}また、ここには引用符がないので再び、これは単語分割とワイルドカードの影響を受けます。 (作業に引用符を追加するか、一致するファイル名にスペースまたはワイルドカードが含まれている場合は重要です...)

リテラル文字列だけが必要な場合は、andを.*使用してください。コマンド置換を使用するには、周囲に引用符を入れます(例:)。list=(".*")for item in "${list[@]}"; ..."$(somecmd)"

また見なさい:

答え2

~からman bash、オプションの下set

-f      Disable pathname expansion.

だから質問は

set -f

ワイルドカードを無効にしてから

set +f

一般的なグロービング動作を再度有効にします。


マニュアルページから少し長い関連抜粋:

パス名拡張

噴射の後に、そうでなければ- Fオプションが設定されており、強く打つ各単語の文字*をスキャンし、[。これらの文字のいずれかが発生すると、その単語はパターンとして扱われ、パターンと一致するファイル名のアルファベット順のリストに置き換えられます。

答え3

バックティック部分はecho …(引用符なし)文字列を生成し.*、その後BASHによって拡張されます。 ".*"がファイルのリストに拡張されたくない場合list=(".*")

関連情報