Geben Sie den Befehl history in die Befehlszeile ein, ohne ihn auszuführen

57

Ich verwende! N, wobei (n) die Zeilennummer für die Ausführung einer Zeile in der Verlaufsdatei ist, die ich an der Eingabeaufforderung ausführen möchte, die ich über history | less finde.

Es gibt jedoch ein Ereignis im Befehlszeilenverlauf, das ich manuell ändern möchte. Wie kann ich einen Verlaufsereignisinhalt in die Befehlszeile einfügen, ohne dass er tatsächlich ausgeführt wird, damit ich ihn ändern und dann die Eingabetaste drücken kann?

Beste,

Vass
quelle

Antworten:

71

Fügen Sie den :p Modifikator hinzu , z !42:p. B. , um anzufordern, dass der Befehl gedruckt und nicht nach dem Ersetzen des Verlaufs ausgeführt wird . Der resultierende Befehl wird auch in den Verlauf eingegeben, sodass Sie ihn durch Drücken Upvon bearbeiten können.

Wenn Sie die histverify Option set ( shopt -s histverify) haben, haben Sie immer die Möglichkeit, das Ergebnis von Verlaufsersetzungen zu bearbeiten.

Die integrierte fcFunktion bietet eingeschränkten Zugriff auf die Verlaufserweiterung (keine Wortbezeichnungen ) und ermöglicht das Bearbeiten eines vorherigen Befehls in einem externen Editor.

Sie können verwenden !prefix, um auf den letzten Befehl zu verweisen, der mit beginnt prefix, und !?substringum auf den letzten Befehl zu verweisen, der mit beginnt substring. Wenn Sie wissen, wonach Sie suchen, kann dies viel Zeit sparen history | less.

Eine andere Möglichkeit zum Durchsuchen des vorherigen Verlaufs ist die inkrementelle Suche: Drücken Sie Ctrl+ Rund geben Sie eine Teilzeichenfolge ein, nach der Sie suchen. Drücken Sie Ctrl+ R, um zum vorherigen Vorkommen des Suchbegriffs zu springen, und Ctrl+, Swenn Sie zu weit gegangen sind. Die meisten Tasten außer Ctrl+ R, Ctrl+ S, Backspaceund gewöhnliche Zeichen beenden die inkrementelle Suche und haben ihre übliche Wirkung (zB Pfeiltasten , um den Cursor in die Zeile bewegen Sie erreicht haben, Enterden Befehl auszuführen).

Gilles 'SO - hör auf böse zu sein'
quelle
Ihr erstes Beispiel enthält einen Tippfehler ...
pbm 15.11.10
9
Sie müssen dies tun, stty -ixonbevor Strg-s funktioniert.
Dennis Williamson
@ Tennis: Wow, moderne Terminalemulatoren machen das nicht standardmäßig? <test> Du hast Recht, sogar das Gnome-Terminal in Ubuntu hat Flusskontrolle!
Gilles 'SO- hör auf böse zu sein'
Ich weiß nicht warum sie es immer noch tun. Es ist unmöglich, etwas beim Scrollen zu fangen. Wenn Sie die Tastenkombination Strg-s drücken, wird erneut eine Eingabeaufforderung angezeigt. Und langsame serielle Verbindungen gehören größtenteils der Vergangenheit an.
Dennis Williamson
@ Dennis's point about Ctrl-sist wichtig, sonst bleibt man stecken wie ich .
imz - Ivan Zakharyaschev
15

Ein weiteres kleines: Alt+#

Kommentiert die aktuelle Zeile aus und verschiebt sie in den Verlaufspuffer.

Wenn Sie also eine Befehlszeile zusammenstellen und einen Zwischenbefehl eingeben müssen, um z. B. eine Datei zu finden, drücken Sie einfach Alt+ #, geben den anderen Befehl ein, gehen in den Verlauf ein, entfernen das Kommentarzeichen und fahren fort.

Rahul Patil
quelle
2
Auch Esc, #arbeitet
Steven Penny
und Sie können es tatsächlich auf einem Mac
eingeben
7

Sie können das magische Feld verwenden, um den Verlauf zu erweitern, bevor Sie die Eingabetaste drücken. Ordnen Sie in Ihrer .inputrc den Raum dem magischen Raum zu:

$if Bash
     Space: magic-space
$endif

Wenn Sie ein Leerzeichen nach einer Verlaufsangabe eingeben, wird es sofort erweitert - praktisch, wenn Sie es auch bearbeiten möchten!

Cascabel
quelle
7

Schauen Sie sich den history-expand-lineBefehl an, an den Alt+^standardmäßig gebunden ist . Dadurch wird die vorhandene Zeile erweitert, die Sie dann bearbeiten können.

Alex Barrett
quelle
4

Mit können Ctrl+rSie den Verlauf durchsuchen:

pbm@tauri ~ $ 
(reverse-i-search)`xran': xrandr -o normal

Jeder gefundene Befehl kann bearbeitet werden ...


Ich denke, dass ich genau das gefunden habe, was Sie brauchen: ausführen shopt -s histverifyund das nächste Mal, wenn Sie den !nBefehl verwenden möchten, wird nicht ausgeführt, sondern nur in die Befehlszeile gestellt ...

pbm
quelle
Sie müssen einen Befehl ausführen, bevor er mit Strg + r gesucht werden kann, nicht nach dem, wonach Vass fragt.
Phunehehe
1
Ich verstehe nicht, wie das nicht geht, was er verlangt. Ich würde hinzufügen, dass, wenn Sie den Befehl zuerst bearbeiten möchten, bevor Sie ihn ausführen, Sie einfach TAB drücken können, sobald Sie den richtigen Befehl gefunden haben.
Steven D
2
Die Prozedur wäre also (1) Strg + r, (2) Typ, bis Sie den Befehl finden, (3) TAB, (4) Bearbeitungsbefehl, (5) EINGABE.
Steven D
1
@phuenhehe: "Aber es gibt ein Ereignis im Befehlszeilenverlauf, das ich manuell ändern möchte"
pbm
1
Wird nicht !n:pfunktionieren?
Alex
1

Ich habe das oft gewollt. Als ich csh (und tcsh) benutzte, hatte ich eine Redewendung:
!:88*:p

Diese Redewendung fügt "Wort 88 bis zum letzten Wort" des vorherigen Befehls an der Stelle ein, an der Sie in die aktuelle Befehlszeile tippen. Dies ist normalerweise das Ende. In csh ist es kein Fehler, dass ein solcher Ausdruck keine Wörter produziert. Das heißt, es muss kein Wort 88 geben, noch eines, das darauf folgt. Wenn kein Wort 88 vorhanden ist, werden dem Ende des eingegebenen Befehls keine Wörter hinzugefügt, und die resultierende Befehlszeile wird ohne Ausführung in den Verlauf verschoben.

Wie Sie wahrscheinlich wissen,
*! (wie !! und! -1) ist der vorherige Befehl;
*: 88 ist Wort 88 (das erste Wort - normalerweise der Befehl - ist Null) und csh würde erfordern, dass ein solches Wort existiert, aber ...
*: 88 * sind alle Wörter, die mit Wort 88 beginnen, und dann tut csh es es ist nicht erforderlich, dass das Wort existiert;
*: p bedeutet Drucken, aber die Befehlszeile nicht ausführen.
Mit oder ohne: p wird die Befehlszeile zum Befehlsverlauf hinzugefügt.

"Warum 88?" du wunderst? Weil es derselbe Schlüssel ist wie der *, den ich brauche. Wenn Sie so lange Befehle haben, vielleicht!: 888 *: p ist das, was Sie brauchen. Entschuldigung, das funktioniert nicht mit bash AFAIK. Bash wird nur sagen bash: :88*: bad word specifier

Unterhaltsame Tatsache: Ihr Befehl muss normalerweise nicht an erster Stelle stehen.
> /tmp/foo echo My command is word 3
ist gültig in bash und csh.

W Dean Stanton
quelle
Da die Frage für bash markiert ist, kann es sinnvoll sein, zunächst zu sagen, dass Ihre Lösung nur in (t) csh funktioniert.
Zagrimsan
0

Normalerweise verwende ich Ctrl+, um rzu suchen und dann Ctrl+ e, um zum Ende der Zeile zu gelangen, ohne sie auszuführen.

nikc
quelle
bereits erwähnt
Jeff Schaller
@ JeffSchaller Ich sehe es nicht. Ich sehe die STRG + R-Referenz. Nein, wo sehe ich die STRG + E, die das fehlende Teil des Puzzles in den obigen Beiträgen ist.
Nikc