シェルがユーティリティのパス名拡張を実行するのはなぜですか?

シェルがユーティリティのパス名拡張を実行するのはなぜですか?

この質問はhttps://stackoverflow.com/questions/7136899/grep の仕組み

は、適用可能な/利用可能なすべてのファイルにshellの展開を行い、それを などのユーティリティに提供しているようです。*.*grep

なぜshellそうする必要があるのでしょうか? パス名の拡張をユーティリティ自体に任せてはいけないのでしょうか?

答え1

理由の 1 つは、すべてのユーティリティがその機能を実装する必要があることです。シェルがそれを実行する場合、実装されるのは 1 回だけです。

答え2

なぜなら、シェルがこの機能を提供しなければ、すべての小さなユーティリティがそれを実装する必要があるからです。

これにより、すべてのコマンドに対して展開がまったく同じように機能することも保証されます。

ちなみに、展開はコマンド引数でのみ発生するわけではなく、シェル スクリプト内のどこでも発生する可能性があります。たとえば、次のようになります。

for file in *.c; do something; done

答え3

シェルがその機能を提供しない場合、すべてのユーティリティが独自のワイルドカード機能を実装する必要があります (そして、おそらくほとんどのユーティリティはそうする必要はないでしょう)。現状では、各ユーティリティは個々のファイル名を処理するだけでよく、これははるかに簡単です。

答え4

これは、「1 つのツールで 1 つのことをうまく行う」という Unix の哲学です。すべてのユーティリティでコードの繰り返しをなぜ望むのでしょうか。main() の後のユーティリティごとに expand_pathnames() を呼び出すことに何の意味があるのでしょうか。C プログラムだけでなく、すべてのコンパイル言語とスクリプト言語にもその負担をかけることに何の意味があるのでしょうか。そのすべてに意味はありません。これが、Microsoft と cmd.exe の忌まわしい機能が最初から間違っていた理由です :-)

ちなみに、ファイル名のグロブをオフにしたい場合は、次のようにします。

$ set -f
$ echo *
*
$ set +f
$ echo *
readme foo.o bar.txt

関連情報