Warum können Shell-Builtins nicht mit Großbuchstaben ausgeführt werden, sondern mit anderen Befehlen?

33

Warum ist das?

Wenn ich das mache

CD ~/Desktop

Es bringt mich nicht zum Desktop. Aber dieses:

echo "foo
bar" | GREP bar

gibt mir:

bar
Anzeigename
quelle
4
Überprüfen Sie, ob alias GREPoder which GREPAusgang nichts.
Chepner
1
Es geht los. Sie haben einen Befehl namens GREP, der sich von unterscheidet grep. (Richtig, es kann nur eine feste Verbindung oder eine symbolische Verbindung zu sein /usr/bin/grep, aber vom Standpunkt der Shell aus ist es ein separater Befehl.)
chepner
12
Warten Sie: Sie arbeiten unter Mac OS X, nicht wahr? Bei HFS + wird standardmäßig die Groß- und Kleinschreibung beibehalten. Wenn also beim Erstellen einer Datei die Groß- und Kleinschreibung eine Rolle spielt, wird bei der Suche nicht zwischen Groß- und Kleinschreibung unterschieden, sobald die Datei vorhanden ist. Das heißt, bashkönnte für eine Datei fragen genannt GREP, aber das Dateisystem hält grepeine Übereinstimmung.
Chepner
1
Ja, weil es Unix ist.
DisplayName
4
Dateisysteme sind unabhängig vom Betriebssystem. Sie können andere Dateisysteme mit Mac OS X verwenden und Sie können (theoretisch) HFS + mit anderen Betriebssystemen verwenden. Sie können HFS + auch zwischen Groß- und Kleinschreibung unterscheiden. Das case-preserving-Verhalten ist aus historischen Gründen nur die Standardeinstellung.
Chepner

Antworten:

71

Was Ihre anderen Fragen betrifft, so verwenden Sie OS X. Das Standard-HFS + -Dateisystem unter OS X unterscheidet nicht zwischen Groß- und Kleinschreibung: Sie können nicht zwei Dateien mit den Namen "abc" und "ABC" im selben Verzeichnis haben und versuchen, darauf zuzugreifen Jeder Name erhält die gleiche Datei. Das Gleiche kann unter Cygwin oder mit Dateisystemen ohne Berücksichtigung der Groß- / Kleinschreibung (wie FAT32 oder ciopfs ) überall passieren .

Da grepes sich um eine echte ausführbare Datei handelt, wird sie im Dateisystem (in den Verzeichnissen von PATH) nachgeschlagen . Wenn Ihre Shell sieht in /usr/binentweder grepoder GREPes wird die finden grepausführbar.

Shell-Builtins werden nicht im Dateisystem nachgeschlagen: Da sie eingebaut sind, erfolgt der Zugriff über (zwischen Groß- und Kleinschreibung unterschiedene) Zeichenfolgenvergleiche innerhalb der Shell.

Was Sie begegnen, ist ein interessanter Fall. While cdist ein eingebautes Programm, auf das unter Berücksichtigung der Groß- und Kleinschreibung zugegriffen wird. Es CDwird als ausführbare Datei gefunden /usr/bin/cd. Die cdausführbare Datei ist ziemlich nutzlos: Da sie sich cdauf die aktuelle Shell-Ausführungsumgebung auswirkt, wird sie immer als integrierte Shell bereitgestellt , es gibt jedoch trotzdem eine cdausführbare Datei für POSIX , die das Verzeichnis für sich ändert und dann sofort beendet und die umgebende Shell verlässt wo es angefangen hat.

Sie können diese mit dem typeeingebauten ausprobieren :

$ type cd
cd is a shell builtin
$ type CD
CD is /usr/bin/CD

typeLegt fest, was die Shell tut, wenn Sie diesen Befehl ausführen. Wenn Sie ausführen cd, greifen Sie auf das eingebaute Programm zu, finden jedoch CDdie ausführbare Datei. Für andere Builtins sind das Builtin und die ausführbare Datei einigermaßen kompatibel (try echo), aber cddas ist nicht möglich.

Michael Homer
quelle
1
gute Antwort. Ich wollte gerade cygwin sagen, was den gleichen Effekt haben würde.
Joshua
@Joshua Das OP-Problem ist gelöst, aber ich denke, für weitere Leser der Frage wäre eine cygwin-basierte Antwort mindestens genauso nützlich wie die vorhandene. Vielleicht können Sie dies zu einer separaten Antwort machen, auch wenn sie kurz ist, und die vorhandenen Antworten für Details aufschieben?
Volker Siegel
1
Warum würde posix einen nutzlosen Befehl wie cd benötigen und warum ist die interne CD von osx nicht geeignet?
John
2
51 positive Bewertungen! Ich hätte gerade eine Antwort
schreiben
1
/ usr / bin / cd hat einen Zweck. Die Syntax ist / usr / bin / cd Verzeichnis Programmargumente
Joshua