Bash: Warum gibt * keinen leeren String zurück, wenn keine Übereinstimmung vorliegt

Bash: Warum gibt * keinen leeren String zurück, wenn keine Übereinstimmung vorliegt

Ich verstehe nicht, warum * sich selbst zurückgibt, wenn es keine Übereinstimmung gibt. DiesAntwortgibt an, dass dies der Fall ist, aber ich verstehe die Gründe für dieses Verhalten nicht. Warum gibt * oder ein beliebiges generisches Muster nicht einfach eine leere Zeichenfolge zurück, wenn keine Übereinstimmung vorliegt?

$ls      # Look, no files
$touch a # Add a file
$echo *  # Works as expected
a
$rm a    # Remove the file
$echo *  # Will output a '*'. Why not ''?
*
$*       # Ok, * will fail, but how come the previous output?
-bash: *: command not found
$

Antwort1

Muster, die mit keiner Datei übereinstimmen, werden als Fehler betrachtet. Dies ist bereits in den ersten Unix-Versionen zu beobachten.

Globuswürde einen Fehler ausgeben und der übergebene Befehl würde nie ausgeführt werden.

Die Fehlermeldung war"Keine Übereinstimmung".

In Ihrer modernen Schale abgeleitet vonBourne (Unix Version 7), ls -l *.cwürde den Fehler „*.c: Keine solche Datei oder kein solches Verzeichnis“ erzeugen. Ich würde sagen, diese Meldung ist leichter zu verstehen; außerdem gibt sie das Muster an, bei dem der Fehler aufgetreten ist.

Beachten Sie, dass bei *.ceiner Erweiterung auf „leer“ ls -l *.cstattdessen alle Dateien im Verzeichnis angezeigt und kein Fehler gedruckt werden.

Bash verfügt über eine failglobOption für ein Verhalten, das näher am Original liegt.

Antwort2

Das * wird tatsächlich von Bash erweitert (was auch immer Ihre Shell ist) und dann an dieEcho. DerEchoDer Befehl tut nichts, sondern druckt es auf die Standardausgabe. Lesen Sie dieses Dokument -Dateinamenerweiterung. Es sagt-

Bash durchsucht jedes Wort nach den Zeichen „*“, „?“ und „[“. Wenn eines dieser Zeichen vorkommt, wird das Wort als MUSTER betrachtet und durch eine alphabetisch sortierte Liste von Dateinamen ersetzt, die dem Muster entsprechen. Wenn keine übereinstimmenden Dateinamen gefunden werden und die Shell-Option nullglob deaktiviert ist, bleibt das Wort unverändert. Wenn die Option nullglob gesetzt ist und keine Übereinstimmungen gefunden werden, wird das Wort entfernt.

Wenn Bash also keine Entsprechung findet, lässt es „*“ unverändert und gibt dies per Echo aus.

Grund Der Grund, warum Bash standardmäßig keine leere Anweisung zurückgibt, liegt darin, dass es Fälle geben kann, in denen der Benutzer „*“ nicht als Platzhalter verwenden möchte und daher die Erweiterung von „*“ nicht benötigt. In diesem Fall wäre die Erweiterung von „*“ zu einer leeren Zeichenfolge daher fehlerhaft. Dieses Standardverhalten kann jedoch durch nullglobeine Option überschrieben werden.

verwandte Informationen