Wählen Sie Befehle aus dem Bash-Verlauf aus

20

Das Drücken der Aufwärtstaste ist mühsam und ich kann den gesuchten Befehl verpassen. Wenn historyich am Terminal tippe, bekomme ich alle Befehle, die ich zuvor eingegeben habe, indiziert zu einer Nummer. Kann ich die mit dem Befehl verknüpfte Nummer auf irgendeine Weise anrufen?

user182936
quelle
Gibt es inzwischen mehr interaktive Optionen? diese sind so fehleranfällig
matt

Antworten:

31

Die Bash-Geschichte kann viele hilfreiche Dinge bewirken, und die Suche Strg-r, die Terry Wang erwähnte, ist eine wichtige unter ihnen. Es ist aber auch möglich, genau das zu tun, wonach Sie gefragt haben.

Sie können den vorherigen Befehl mit erneut ausführen !!. Hiermit können Sie auch den vorherigen Befehl bearbeiten. Wenn Sie zum Beispiel vergessen haben, Root-Rechte für einen Befehl zu erhalten

apt-get install a-long-list-of-packages

Sie müssen das alles nicht noch einmal eingeben. Stattdessen einfach anrufen

sudo !!

Wenn Sie den Befehl an einer bestimmten Position von Ihrer Geschichte erneut ausführen möchten, können Sie auch nutzen !, zum Beispiel

!3

Führen Sie den Befehl an Position 3 erneut aus. Beachten Sie, dass dies von oben zählt. Wenn Sie also 500 Befehle in Ihrem Verlauf speichern, !1wäre dies "vor 500 Befehlen". Sie können auch negative Zahlen verwenden. Beispielsweise

!-2

würde den vorletzten Befehl erneut ausführen.

Sie können auch den letzten Befehl erneut ausführen, der mit einer Zeichenfolge wie gestartet wurde

!apt-

Das würde die letzte Zeile wiederholen, die mit "apt-" begann. Wenn Sie den letzten Befehl haben möchten, bei dem der String irgendwo in der Zeile vorkommt, können Sie so etwas wie verwenden

!?pt-ge

Es gibt interessantere Dinge, die die Bash-Geschichte tun kann. Um einen Eindruck von den vielfältigen Möglichkeiten zu bekommen, können Sie gezielt auf einen Parameter eines Befehls aus der Historie zugreifen. So

!-5:3:p

würde den dritten Parameter bis zum fünften vom letzten Befehl ausgeben.

BEARBEITEN: In Bezug auf Rudies Kommentar unten werden diese Bash-History-Erweiterungen mit den Standardeinstellungen tatsächlich direkt ausgeführt. Es ist wahrscheinlich am besten so zu beschreiben: Ein Aufruf wie !-3wird durch die Shell mit dem drittletzten Befehl aus Ihrem Verlauf ersetzt und dann Ihre Eingabe (mit dem Ersetzen) ausgeführt. Wenn Sie also tippen !-3und drücken ENTERund Ihr drittletzter Befehl war ls ~, ist er in der Tat derselbe, als hätten Sie ls ~erneut getippt und ENTER"auf eigene Faust" gedrückt .

Wenn Sie das nicht möchten, können Sie die Shell-Option einstellen histverify. Zum Festlegen und Deaktivieren von Shell-Optionen möchten Sie möglicherweise den shoptBefehl nachlesen . Mit histverifyset !-3schreibt ein Aufruf wie nur die Ersetzung aus Ihrem Verlauf in Ihre Befehlszeile, führt sie jedoch nicht direkt aus. Sie müssen sozusagen ENTERselbst auf das Entscheidende drücken - oder es unterlassen, wenn Sie möchten.

Henning Kockerbeck
quelle
Ist !also verdammt gefährlich ... Ich würde gerne wissen, was !-4genau passiert ist, bevor ich es starte . Oder zeigt es Ihnen zuerst? Coole Zusammenfassung!
Rudie
1
@Rudie Das ist ein guter Punkt, ich habe meine Antwort aktualisiert. Die Verlaufsfunktionen dienen hauptsächlich dazu, Ihre Arbeit zu beschleunigen und Tastatureingaben zu speichern. Also ein Standard "Meinst du das wirklich, wirklich?" würde diesen Zweck zumindest teilweise zunichte machen. Und obwohl Sie das könnten, werden Sie normalerweise keinen "weit zurück" -Befehl wie aufrufen !-238. Es sollte nicht allzu schwer sein, sich an Ihren vorletzten, drittletzten und vielleicht letzten Befehl zu erinnern;) Wie so oft bei Linux (und eigentlich beim Computing im Allgemeinen) wird erwartet, dass Sie wissen, was Sie tun. Und wenn Sie wirklich das zusätzliche Sicherheitsnetz wollen, ist es eines shoptentfernt;)
Henning Kockerbeck
16

Ja da ist. Wenn Sie beispielsweise den Befehl mit der Nummer 1234 ausführen möchten, gehen Sie wie folgt vor:

!1234

Andere nützliche Sachen:

  • Wenn Sie den zuletzt ausgeführten Befehl ausführen möchten, gehen Sie wie folgt vor:

    !!
  • Wenn Sie den zuletzt ausgeführten lsBefehl ausführen möchten, gehen Sie wie folgt vor:

    !ls
  • Wenn Sie gerade gelaufen ls /some/long/pathsind und möchten cd, tun Sie Folgendes:

    cd !$

Für mehr Informationen:

Alaa Ali
quelle
3

Wenn Sie die Verlaufsnummer eines Befehls gefunden haben und diesen erneut ausführen möchten, geben Sie !gefolgt von der Nummer ein, z . B., !1234und drücken Sie Enter. Dies ist Teil der Erweiterung der Geschichte . Sie können Modifikatoren darauf anheften.

Wenn Sie den Befehl bearbeiten möchten, bevor Sie ihn fc 1234ausführen , rufen Sie einen externen Editor auf.

Aber als Terry Wang bereits erwähnt gibt es in der Regel schneller Möglichkeiten, einen Befehl in der Geschichte Ortung als seine Geschichte Nummer bestimmen, einschließlich Ctrl+ Rinkrementelle Suche (drücken Sie aufrufen , Enterwenn Sie den Befehl , den Sie ausführen möchten , gefunden haben), oder fc PREFIXdie vorherige auszuführen Befehl beginnend mit PREFIX.

Gilles 'SO - hör auf böse zu sein'
quelle
1

Der historyBefehl zeigt alle Befehle und die dazugehörigen Nummern an. Wenn Sie nur eine kurze Überprüfung durchführen möchten, bevor Sie die Befehlszeile Nr. 135 ausführen, können Sie Folgendes eingeben:

echo !135

Dies zeigt Ihnen, was ausgeführt wird.

Bruce M
quelle