Diese Frage ist eine Fortsetzung vonhttps://stackoverflow.com/questions/7136899/wie-funktioniert-grep
Es scheint, dass shell
die Erweiterung von *.*
auf alle anwendbaren/verfügbaren Dateien erfolgt und diese Dienstprogrammen wie zur Verfügung stellt grep
.
Warum ist das shell
nötig? Warum überlässt man die Pfadnamenerweiterung nicht dem Dienstprogramm selbst?
Antwort1
Ein Grund dafür ist, dass jedes Dienstprogramm diese Funktionalität implementieren müsste. Wenn die Shell dies tut, wird es nur einmal implementiert.
Antwort2
Denn wenn die Shell diese Funktion nicht bereitstellen würde, müsste jedes einzelne kleine Dienstprogramm sie implementieren.
Dadurch wird auch sichergestellt, dass die Erweiterung bei jedem Befehl genau gleich funktioniert.
Übrigens kommt die Erweiterung nicht nur in Befehlsargumenten vor, sie kann überall in einem Shell-Skript vorkommen, zum Beispiel:
for file in *.c; do something; done
Antwort3
Wenn die Shell diese Funktionalität nicht bereitstellen würde, müsste jedes Dienstprogramm seine eigene Platzhalterfunktion implementieren (und die meisten würden sich wahrscheinlich nicht die Mühe machen). So wie es ist, muss jedes Dienstprogramm nur einzelne Dateinamen verarbeiten, was viel einfacher ist.
Antwort4
Es ist die Unix-Philosophie: „Ein Tool muss eine Sache gut machen“. Warum sollte jemand diese Codewiederholung in jedem Dienstprogramm wollen? Was bringt es, wenn jedes einzelne Dienstprogramm nach main() expand_pathnames() aufruft? Was bringt es, diese Last nicht nur C-Programmen, sondern auch allen kompilierten Sprachen und Skriptsprachen aufzubürden? Das alles hat keinen Sinn. Deshalb haben Microsoft und die cmd.exe-Abscheulichkeit es vom ersten Tag an falsch gemacht :-)
Übrigens, wenn Sie das Globbing von Dateinamen deaktivieren möchten, können Sie das tun mit
$ set -f
$ echo *
*
$ set +f
$ echo *
readme foo.o bar.txt