Bash verwendet Ausrufezeichen für Verlaufserweiterungen, wie in den Antworten auf diese Frage erläutert (führt z. B. sudo !!
die vorherige Befehlszeile mit aus sudo
). Ich kann jedoch nirgendwo etwas finden, das erklärt, was das Ausführen des folgenden Befehls (dh eines einzelnen Ausrufezeichens) bewirkt:
!
Es scheint nichts zu drucken und mit 1 zu beenden, aber ich bin nicht sicher, warum es das tut. Ich habe online und in der Bash-Manpage nachgesehen, kann aber nichts finden, abgesehen von der Tatsache, dass es sich um ein "reserviertes Wort" }
handelt.
}
druckt einen Fehler:
bash: syntax error near unexpected token `}'
!
Gibt den "Start" eines Verlaufserweiterungsausdrucks an.Antworten:
Der Einsame
!
am Anfang eines Befehls negiert den Beendigungsstatus des Befehls oder der Pipeline : Wenn der Befehl beendet0
wird, springt er auf1
(Fehler) und wenn er nicht auf Null beendet wird, wird er in einen0
(erfolgreichen) Beendigungsstatus umgewandelt.Diese Verwendung ist im Bash-Handbuch dokumentiert:
A
!
ohne folgenden Befehl negiert den leeren Befehl, der nichts tut und true zurückgibt (entspricht dem:
Befehl ). Es invertiert also das Wahr in ein Falsch und wird mit dem Status 1 beendet, erzeugt jedoch keinen Fehler.Es gibt auch andere Verwendungen
!
innerhalb der Befehletest
und[[
, bei denen sie einen bedingten Test negieren. Diese haben nichts mit dem zu tun, was Sie sehen. Sowohl in Ihrer Frage als auch in diesen Fällen hat dies nichts mit der Erweiterung der Historie zu tun und!
wird von anderen Begriffen getrennt.quelle
Das einzige Ausrufezeichen finden Sie im Bash-Handbuch, Abschnitt 3.2.2 Pipelines
Auch Abschnitt 3.2.4.2 Bedingte Konstrukte
Siehe auch Abschnitt 4.1 Bourne Shell Builtins
Es sollte auch beachtet werden, dass
!
die Ersetzung des Verlaufs gestartet wird, sofern nicht gefolgt von: einem Leerzeichen, einem Tabulator, dem Ende der Zeile, '=' oder '(' (wenn die Option extglob shell mit der integrierten Option shopt aktiviert ist).quelle
Denn
!
wird in Vergleichen verwendet und bedeutet NICHT .Beispielsweise:
quelle
!
als Argument für dentest
Befehl (einschließlich der in bash integrierten Version), nicht die Bedeutung von!
bei Verwendung in der Befehlsposition.! [...]
, die Frage in diesem Fall zusammenzubringen.[]
isttest
. Ich bin ein bisschen beeilt.!
Eingebauter Befehl kehrt den Sinn einer Pipeline um.Andere Verwendungen:
#!
Mit dem integrierten Befehl wird der angegebene Interpreter aufgerufen, um das Skript auszuführen.!
Ereignisbezeichner, markiert ein Befehlszeilenwort als Verlaufsersetzung!=
Ungleichungsoperator$!
Shell-Variable, gibt die Prozessnummer des letzten Hintergrundbefehls zurück.quelle
ls -l /tmp
cd !$
folgt zu verwenden : Dadurch gelangen Sie in das Verzeichnis / tmp.! gefolgt von einer Zeichenfolge führt den zuletzt ausgeführten Befehl aus (der sich noch im Befehlspuffer befindet), der mit der angegebenen Zeichenfolge begonnen hat. Vielleicht hat die Shell gerade herausgefunden, dass kein vorheriger Befehl mit <null> begann.
quelle