「grep '.*[s]' file」は機能しますが、「grep .*[s] file」は機能しないのはなぜですか?

「grep '.*[s]' file」は機能しますが、「grep .*[s] file」は機能しないのはなぜですか?

比較する

grep '.*[s]' ファイル

そして

grep .*[s] ファイル

これがうまくいくにはなぜ見積もりが必要ですか? 2番目のケースでは、grepがピリオドを含むすべてのファイルを確認しようとしているようです。

答え1

パラメータの周りの引用符(単一または二重)は、グローバル拡張を抑制します。

最初の例は正規表現を引数として渡しますgrep。 2番目の例には、シェル自体に拡張されたglobパターンが含まれており、そのパターンに合ったファイル名を引数として渡しますgrep

答え2

また比較しなさい:

echo '.*[s]' file

そして

echo .*[s] file

これにより、コマンドで確認した引数が出力されます。

最初の例では、grepモードとファイルの2つのパラメータをコマンドに渡しました。

2番目の例ではシェル最初の引数は処理され、ドットで始まり、「s」で終わるすべてのファイルに置き換えられます。したがって、grepコマンドは複数の引数を使用し、明示的に指定された他のすべての拡張ファイル名とファイルの中で最初の(拡張)ファイル名を見つけようとします。

関連情報