Wenn ich tippe
::
In eine Bash-Shell bekomme ich:
-bash: ::: command not found
Aber nur eines :
führt zu keiner Ausgabe. Warum ist das?
command-line
bash
NerdOfLinux
quelle
quelle
Antworten:
Die
:
Shell eingebaut vs nicht vorhanden::
Der
:
eingebaute Shell-Befehl existiert (beachte den Unterschied zwischen externen und eingebauten Befehlen ), der nichts bewirkt; es gibt nur Erfolg zurück, genau wie dertrue
Befehl. Das:
eingebaute ist Standard und wird durch den POSIX-Standard definiert , wo es auch als "Null-Dienstprogramm" bezeichnet wird. Es wird häufig zum Testen oder Ausführen von Endlosschleifen wie in verwendetwhile : ; do ...;done
Allerdings werden
::
- zwei Doppelpunkte zusammen - als ein "Wort" für die Shell interpretiert und es wird davon ausgegangen, dass es sich um einen Befehl handelt, den der Benutzer eingegeben hat. Die Shell überprüft die eingebauten Funktionen und anschließend alle Verzeichnisse in derPATH
Variablen auf das Vorhandensein dieses Befehls. Es gibt jedoch weder einen eingebauten::
noch einen externen Befehl::
. Daher erzeugt das einen Fehler.Was ist ein typisches Format für einen Fehler?
Was Sie also sehen, sind nicht drei Doppelpunkte, sondern das, was Sie eingegeben haben, wurde in das Standardfehlerformat eingefügt.
Beachten Sie auch, dass
:
dies Befehlszeilenargumente annehmen kann, dh es ist zulässig, Folgendes zu tun:In diesem Fall betrachtet die Shell dies als zwei "Wörter", von denen eines ein Befehl und das andere ein Positionsparameter ist. Das wird auch keinen Fehler erzeugen! (Siehe auch den historischen Hinweis (weiter unten in dieser Antwort) zur Verwendung von
:
mit Positionsparametern.)In anderen Schalen als Bash
Beachten Sie, dass die Formatierung auch zwischen verschiedenen Shells variieren kann. Für
bash
,ksh
und istmksh
das Verhalten konsistent. Zum Beispiel Ubuntus Standard-/bin/sh
Shell (die eigentlich ist/bin/dash
):Dabei ist 1 die Befehlsnummer (entspricht der Zeilennummer in einem Skript).
csh
im Gegensatz dazu erzeugt überhaupt keine Fehlermeldung:Tatsächlich wird bei der Ausführung
strace -o csh.trace csh -c ::
der Ablaufverfolgungsausgabe in dercsh.trace
Datei angezeigt, dass siecsh
mit dem Beendigungsstatus 0 (keine Fehler) beendet wird. Abertcsh
gibt den Fehler aus (allerdings ohne seinen Namen auszugeben):Fehlermeldungen
Im Allgemeinen sollte das erste Element in der Fehlermeldung der ausführende Prozess oder die ausgeführte Funktion sein (Ihre Shell versucht auszuführen
::
, daher kommt die Fehlermeldung von der Shell). Zum Beispiel ist hier der ausführende Prozessstat
:Tatsächlich definiert POSIX die perror () -Funktion, die gemäß der Dokumentation ein Zeichenfolgenargument verwendet, eine Fehlermeldung nach dem Doppelpunkt ausgibt und dann eine neue Zeile. Zitat:
Und das String-Argument für
perror()
technisch könnte alles sein, aber der Übersichtlichkeit halber ist es normalerweise der Funktionsname oderargv[0]
.Im Gegensatz dazu GNU hat seinen eigenen Satz von Funktionen und Variablen für die Fehlerbehandlung , die ein Programmierer mit verwenden kann ,
fprintf()
umstderr
Strom. Wie eines der Beispiele auf der verlinkten Seite zeigt, könnte Folgendes geschehen:Historische Notiz
In der alten Unix- und Thompson-Shell
:
wurde mitgoto
Anweisung (die laut Benutzer namens Perderabo in diesem Thread keine eingebaute Shell war) gearbeitet. Zitat aus dem Handbuch:Sie könnten also so etwas tun, um ein Endlosschleifenskript zu erstellen:
quelle
command.com
und Windowscmd.exe
haben eine ähnliche, aber entgegengesetzte Situation: Es:
handelt sich explizit um ein goto-Label (kein Befehl) und wird häufig als Kommentarzeichen (z:: This is a comment
. B. ) umfunktioniert .Der letzte Doppelpunkt ist nur ein Teil der Standardmeldung "Nicht gefunden":
Der Grund, warum ein einzelner Doppelpunkt nichts erzeugt, ist, dass
:
es sich um einen gültigen Befehl handelt - obwohl er nichts tut (außer returnTRUE
). Aus demSHELL BUILTIN COMMANDS
Bereichman bash
:Sie werden es manchmal in Konstruktionen wie sehen
Siehe zum Beispiel Welchen Zweck erfüllt der eingebaute Doppelpunkt?
quelle
Versuchen Sie es mit einem anderen nicht vorhandenen Befehl, und Sie werden feststellen, dass der Befehl
:
auf Englisch seinen normalen Zweck erfüllt:quelle
Der hinzugefügte Doppelpunkt ist Teil der Fehlermeldung. Wenn man
cd ow
es eingibtbash: cd: ow: No such file or directory
, ergibt das, dass der Fehler im zusätzlichen Doppelpunkt steht: No such file or directory
quelle
Der dritte ist ein Abstandhalter von der Formatierung
in bash a
:
ist eine leere Zeilenanweisungquelle
Sie erhalten 3 Doppelpunkte, da das Fehlerformat einen Doppelpunkt enthält:
quelle