Wie kann ein vorheriger Befehl (ohne Ausführung) aufgerufen werden, um ihn zu ändern?

14

Ich kann mich nicht an den Trick erinnern, bei dem ich den letzten Befehl erhalten konnte, ohne ihn auszuführen:

Nehmen wir an, ich möchte in der Lage sein, auf den Befehl zuzugreifen! 1255, indem ich die Aufwärtspfeiltaste drücke und den Befehl ändere. Also, wie lautet der Trick, um den Befehl aufzurufen, in der Befehlszeile anzuzeigen, aber nicht auszuführen und anschließend über die Pfeiltaste nach oben zuzugreifen?

Ich habe versucht, ein Echo zu setzen, aber dann habe ich ein Echo vor dem Befehl. Ich weiß nicht mehr, wie ich es richtig machen soll.

Arturas M
quelle
4
Wenn ich Ihre Anfrage richtig verstehe, versuchen Sie es vielleicht mit einem Suffix von ": p" wie in "! 1255: p"
Theophrastus
@Theophrastus Ja, genau, ich hatte diesen Teil vergessen: p und konnte anscheinend nicht die richtigen Keywords in Google finden ... Danke Jungs.
Arturas M

Antworten:

21
!1255:p

Werde das tun

!Beim Abrufen
1255der Historie wird die Zeilennummer
:pgedruckt, aber nicht ausgeführt

Dann können Sie den Pfeil nach oben verwenden, um zum vorherigen (nicht ausgeführten) Befehl zurückzukehren, und Sie können ihn nach Bedarf ändern.

Ich kombiniere dies oft mit hg("History Grep") - meinem Lieblingsalias.

$ alias hg  # Maybe use hgr instead if you are a Mercurial CLI user.
alias hg='history | tail -200 | grep -i'

Dies sucht unabhängig von Groß- und Kleinschreibung nach Text in einer aktuellen Verlaufszeile und wird folgendermaßen verwendet:

Wenn ich nach den letzten vi-Befehlen suchen möchte, um eine bestimmte Datei zu bearbeiten, und dann einen von ihnen wiederverwenden möchte, um dieselbe Datei mit einer anderen Dateierweiterung zu bearbeiten.

$ hg variables
 6153  vi Variables/user-extensions.js 
 6176  vi Variables/user-extensions.js 
 6178  vi Variables/user-extensions.js 
 6190  vi Variables/user-extensions.js 
 6230  hg variables
$ # Notice the difference in case with V and v is ignored
$ !6190:p
vi Variables/user-extensions.js 
$ ["up-arrow"]
$ vi Variables/user-extensions.[now change .js to .html]

Ich definiere auch hga("History Grep All"), um meine gesamte Geschichte zu durchsuchen:

$ alias hga
alias hga='history | grep -i'

Ich verwende es jedoch nicht oft, da mein Verlauf (absichtlich) sehr umfangreich ist und ich zu viele Ausgaben erhalte, die sich später auf das Zurückblättern durch die Seiten in meinem Terminal auswirken.

Michael Durrant
quelle
2
Beachten Sie, dass dies hgauch die CLI von Mercurial ist .
Usandfriends
1
Gute Notiz. Zur Antwort hinzugefügt.
Michael Durrant
12

Durch Drücken von Ctrl+ R(das ist die umgekehrte inkrementelle Suchschlüsselbindung des Emacs, wenn @gnp in den Kommentaren angegeben wird) im Terminal können Sie im Archiv nach einem bestimmten Befehl suchen. Der Befehl wird angezeigt und kann vor der Ausführung bearbeitet werden. Sie werden so etwas sehen:

Bildbeschreibung hier eingeben

Quelle

Hamza Abbad
quelle
1
Vielen Dank! Nicht wirklich die direkte Antwort auf meine Frage, aber ich wusste das nicht und finde es wirklich nützlich. Vielen Dank!
Arturas M
1
Bemerkenswert ist auch, dass Strg + R die umgekehrte inkrementelle Suche von Emacs ist. Viele Emacs-Tastenkombinationen funktionieren mit vielen GNU-Werkzeugen: Strg + A, Strg + E, Strg + K, Strg + Y und anderen.
GnP
@gnp Danke für die Information, das wusste ich nicht.
Hamza Abbad
Ich habe lange gebraucht, um mich mit Strg-R vertraut zu machen, nachdem ich zwei wichtige Dinge gelernt hatte. 1. Ignorieren Sie die Ausgabe, während Sie tippen. 2. Vergewissern Sie sich, dass Sie genug wissen, um den gewünschten Befehl eindeutig einzugeben
Michael Durrant,
7

der fcbefehl macht was sie wollen

fc -l <number> listet den Befehlsverlauf um diese Nummer auf

fc <number>öffnet diesen Befehlszeileneintrag in vim(oder was auch immer Ihr Standardeditor ist, nehme ich an), so dass Sie ihn bearbeiten können, und daraufhin :wqsteht er Ihnen mit dem Aufwärtspfeil zur Verfügung.

Soße
quelle
7

In bash wird Ctl+alt+edie Shell-Erweiterung ausgeführt. Wenn !1255Sie diese Kombination eingeben und dann drücken, wird die aktuelle Zeile durch den Inhalt des Verlaufseintrags 1255 ersetzt

Adonis
quelle
Das habe ich auf Ubuntu nicht getan
Michael Durrant
@MichaelDurrant, ich habe es gerade am 14.04 (kubuntu) ausprobiert und es funktioniert bei mir. Es ist dokumentiert in man bashals shell-expand-line. Vielleicht gibt es eine Abkürzung für das Gnome-Terminal.
Adonis
@adonis Ich habe diesen nie gekannt, vielen Dank, in der Tat macht er das, was ich auch verlangt habe. Und in der Tat kann ich mehr Anwendungen von dieser Funktion finden. Genial! Vielen Dank!
Arturas M
4

Sie möchten den Befehl fc verwenden, während Sie eine Liste angeben, anstatt (-l) auszuführen.

fc -ln -1
Miau
quelle