it-swarm.com.de

Das Ausrufezeichen (!) In Bash verstehen

Ich benutzte

history | less

um die Zeilen der vorherigen Befehle und die Zahlen auf der linken Seite zu erhalten, fand ich die Zeile, die ich wiederholen wollte (z. B. 22) und tat es

!22

bei der Eingabeaufforderung und es hat funktioniert - Ausführen der Befehle in der Zeile, die ich damals ausgeführt habe. Ich kann nicht herausfinden, wo das Ausrufezeichen verwendet wird, was es in Bezug auf die von bash ergriffenen Maßnahmen darstellt und wo es verwendet werden soll. Aus der Dokumentation sehe ich keine Erklärung, die "greifbar" ist.

112
Vass

! Ist eine Funktion, die ursprünglich in der C-Shell erschien, damals, als Sie sich darauf verlassen konnten, dass Terminals Pfeiltasten haben. Dies ist besonders nützlich, wenn Sie der Eingabeaufforderung die aktuelle Befehlsnummer hinzufügen (PS1="\!$ "), Damit Sie schnell auf Ihren Bildschirm schauen können, um Nummern für frühere Befehle zu erhalten.

Jetzt können Sie Pfeiltasten und ähnliches verwenden Ctrl-R Um den Befehlsverlauf zu durchsuchen, sehe ich nicht viel Verwendung für die Funktion.

Eine Variante, die Sie möglicherweise noch nützlich finden, ist !!, Die den vorherigen Befehl erneut ausführt. Allein finde ich nicht !!Enter schneller als nur Enter, aber es kann hilfreich sein, wenn es zu einem größeren Befehl kombiniert wird.

Beispiel: Ein häufiger Pilotfehler auf Sudo basierten Systemen ist zu vergessen das Präfix Sudo für einen Befehl, für den zusätzliche Berechtigungen erforderlich sind. Ein Anfänger gibt den gesamten Befehl erneut ein. Der fleißige Schüler bearbeitet den Befehl aus dem Befehlsverlauf der Shell. Der Erleuchtete gibt Sudo !! Ein.

Mit Bash können Sie die Verarbeitung von ! In der Shell mit set +o histexpand Oder set +H Deaktivieren. Sie können es in Zsh mit set -K Deaktivieren.

157
Warren Young

Wenn es hier keine längere Antwort gibt, gibt es sicherlich eine auf Super User, da ich kürzlich eine gelesen habe. In der Bash Manpage finden Sie einen riesigen Abschnitt mit dem Titel HISTORY EXPANSION zu diesem Thema.

Sie können einen ganzen Host mehr als nur den letzten Befehl oder die Befehlsnummer X ausführen. Sie können Dinge wie !cat, um den letzten Befehl auszuführen, der mit cat gestartet wurde. Oder !?bash?:s/bash/csh/ führt den letzten Befehl aus, der bash enthält, ersetzt ihn jedoch durch csh.

52
Cry Havok

Mit ! Kann noch viel mehr getan werden, wie zum Beispiel:

  • führen Sie einen Befehl aus, der vor 3 Befehlen eingegeben wird: !-3
  • führen Sie einen Befehl aus, der mit !ls beginnt.

und vieles mehr. Siehe 15 Beispiele zur Erweiterung des Linux-Bash-Verlaufs, die Sie kennen sollten

40
user379997

Natürlich können Sie !! Ausführen, um den letzten Befehl in der Bash-Shell wiederzuverwenden. Und dann gibt es !$, Um den letzten Teil Ihres letzten Befehls wiederzuverwenden.

z.B. Eine Datei anzeigen

less path/to/your/file.txt

Wenn Sie jetzt dieselbe Datei bearbeiten möchten, können Sie mit !$ Nur den Dateipfad aus dem letzten Befehl abrufen

vim !$

BEARBEITEN:

Sie können alle Argumente des vorherigen Befehls mit !* Verwenden.

beispiel: Dadurch werden einige Dateien erstellt und alle entfernt

$ touch a.txt b.txt c.txt d.txt
$ rm !*

Auch hier können Sie ein bestimmtes Argument des vorherigen Befehls verwenden

z.B. Dadurch werden 4 Dateien erstellt und die 3. Datei (c.txt) entfernt.

$ touch a.txt b.txt c.txt d.txt
$ rm !:3

Ebenso können Sie eine Reihe von Argumenten aus dem letzten Befehl wie folgt verwenden

$ touch a.txt b.txt c.txt d.txt
$ rm !:2-4

Dadurch werden die Argumente 2 bis 4 wiederverwendet, wodurch der Ausdruck zu rm b.txt c.txt d.txt Bewertet wird.

6

Ein Freund von mir hat mir Folgendes per E-Mail geschickt:

Es ist Teil von GNU Verlaufsbibliothek. In Bash wird es verwendet, um Befehle in Ihrem Verlauf erneut auszuführen. Wenn Sie Hardcore sein möchten, suchen Sie in bash-4.1/lib/readline/histexpand nach history_expansion_char .c für Implementierungsdetails.

4
Vass