Terminal austauschen! gefolgt von einer Nummer mit einem Befehl

12

Ich bin sehr verwirrt über meine Ubuntu-Terminalsitzung. Sie scheint Abschnitte in Befehlen zu ersetzen, !die mit einer Zahl beginnen, gefolgt von scheinbar zufälligen Befehlen. Dies geschieht durch !87Ersetzen durch screen -lund auch durch !88und Ersetzen durch ls.

Alle Ideen, warum dies geschieht, wäre sehr dankbar.

usbpc102
quelle

Antworten:

20

Das ist bashdie Geschichtserweiterung, z

!87

Führt den Befehl in der Verlaufszeile erneut aus 87.

Die Beschreibung dieser Funktion finden Sie im man bashAbschnitt „ERWEITERUNG DER GESCHICHTE“:

       An  event  designator  is  a  reference  to a command line entry in the
       history list.  Unless the reference is absolute, events are relative to
       the current position in the history list.

       !      Start  a  history substitution, except when followed by a blank,
              newline, carriage return, = or ( (when the extglob shell  option
              is enabled using the shopt builtin).
       !n     Refer to command line n.
       !-n    Refer to the current command minus n.

Um also schnell den letzten Befehl aufzurufen, machen Sie !-1und für den fünftletzten Befehl !-5. Ein praktisches Synonym für !-1ist !!- wenn Sie zB angerufen haben apt install somethingund das vergessen haben sudo, führen sudo !!Sie einfach aus und Sie sind gut.

Nur Backslash ( \ ) und einfache Anführungszeichen können das Verlaufserweiterungszeichen zitieren.

Um eine Erweiterung des Verlaufs zu vermeiden, müssen Sie entweder das Ausrufezeichen mit einem Backslash ( \!) oder einfache Anführungszeichen ( '!') setzen.

Dessert
quelle
3
Um !Ihren Befehlen eine Lektüre zukommen zu lassen und eine Erweiterung des Verlaufs zu vermeiden, müssen Sie sie in einfache Anführungszeichen setzen oder sie umgehen: foo '!87'oder foo \!87. (doppelte Anführungszeichen erweitern auch den Inhalt.)
Quixotic