Wie kopiere ich einen zuvor eingegebenen Befehl mit dem Dienstprogramm history, ohne ihn erneut auszuführen?

14

Ich kann den historyBefehl unter CentOS verwenden, um eine Liste der zuvor eingegebenen Befehle abzurufen. Wenn ich jedoch Folgendes tue:, !372wird der Verlauf versuchen, den referenzierten Befehl auszuführen.

Ich benötige den vorherigen Ausführungsbefehl, um am aktuellen Cursor zu erscheinen. Hier ist ein Beispiel:

[dev@home ~]$ previous_command_no_execute!372  
centosnoob
quelle

Antworten:

25

Wie wäre es, geben Sie dies in Ihre Befehlszeile ein:

$ !372

Drücken Sie dann ESCgefolgt von CTRL+E. Dadurch wird die Befehlszeile automatisch erweitert, ohne dass sie ausgeführt wird. (Erweitert auch alles andere in der Zeile, einschließlich env vars)

Dies funktioniert meines Wissens nur auf Bash.

SmallClanger
quelle
Ja, das ist die genaue Lösung.
Centosnoob
1
Wenn Sie eine Lösung in zsh suchen, drücken Sie nach der Eingabe die Tabulatortaste !372, um sie zu erweitern.
Reid
10

Sie können Ctrlreinige Zeichen aus dem ursprünglichen Befehl verwenden und dann eingeben, z

(reverse-i-search)`/etc': sudo /etc/init.d/apache2 restart

Oben habe ich getippt Ctrl-r /etcund es ruft den sudo /etc/init.d/apache2 restartBefehl aus der Historie auf

user9517
quelle
6

history | grep 372 sollte funktionieren, oder?

Bearbeiten:

Zusätzlich können Sie etwas tun echo !372 > /dev/clip, um das Befehlsverzeichnis in Ihre Zwischenablage zu kopieren.

MDMarra
quelle
immer für mich gearbeitet ...
voretaq7
no findet nur den zuvor ausgeführten Befehl.
Centosnoob
Dann missverstehen sowohl ich als auch @ voretaq7 Ihre Frage. Könnten Sie vielleicht etwas klarer sein?
MDMarra
@MDMarra Ich habe die Frage aktualisiert. Ich hoffe, es bringt etwas mehr Licht ins Dunkel.
Centosnoob
@centosnoob betrachtet Ihr Update und geht davon aus, dass Ihre Konsole eine Maus und Copy-Paste unterstützt (und es ist heutzutage selten, dass Sie sich direkt auf der Terminal-Konsole ohne Copy-Paste-Funktion befinden) . vi-Stil Befehl Bearbeitung , wie ich in meiner Antwort skizzierte ist eine weitere Option, aber ich bin ein vi Eiferer und sogar ich nicht verwenden vi-Bearbeiten von Kommandozeilen ...
voretaq7
4

MDMarra gab den einfachen Weg ( history|grepund kopieren / einfügen mit Ihrer Desktop-Umgebung, vorausgesetzt, Sie haben eine). Ich gebe, wie ich es nenne, auf die harte Tour, die funktioniert, wenn Sie keine Desktop-Umgebung oder Maus haben.

Angenommen, Sie führen bash als Shell aus:

$ set -o vi
$ ESC372k

(Sie haben jetzt den Befehl, den Sie vor 372 Befehlen ausgeführt haben, in der Zeile und befinden sich im viBefehlsmodus -style. Bearbeiten Sie ihn so, als würden Sie ex/ verwenden. vi)

voretaq7
quelle
Interessant. Das scheint nur zu funktionieren, wenn Sie "set -o vi" frühzeitig ausgeführt haben. Könnte sein, dass das in Bash-Profil oder so etwas gebracht werden muss.
Matt
Dies ist eines der Dinge, die Sie mit einem Schock bemerken: "Ich verwende immer vi, warum verwende ich nicht vi-Bindungen, um Linien in bash zu bearbeiten." Es dauert eine Weile, bis man sich daran gewöhnt hat. Dann fühlen sich die Emacs-ähnlichen Bindungen, die alle anderen verwenden, seltsam und nutzlos an.
cjc
@Matt Ja - Sie müssen Ihren Bearbeitungsmodus auf -Stilbearbeitung einstellen vi. Es sollte so schnell wie möglich set -o vifunktionieren und für den gesamten Verlauf (der Bearbeitungsmodus ist nur eine Schnittstelle zum Befehlsverlauf der Shell und zu anderen Dingen).
Voretaq7
@cjc Ich benutze vi als Editor meiner Wahl, aber ich benutze keine vi-artigen Bindungen, um meine Befehlszeile zu bearbeiten (ich wusste nur zufällig, wie das im vi-Modus von oben zu tun ist, aber andere haben gepostet das äquivalent im emacs-modus was freundlicher sein kann :).
Voretaq7
4

Der einfachste und schnellste Weg, um das zu tun, was Sie wollen, ist das Ausführen von:

!372:p

gefolgt von Enterund

MikeyB
quelle
0

Befinden Sie sich auf einem Desktop-System oder Server?

Auf meinem Kubuntu-Desktop-System unterstützt es das Hervorheben mit der Maus, wenn die Shell geöffnet ist. Normalerweise hebe ich den Text einfach mit der Maus hervor und klicke auf die mittlere Maustaste, um ihn einzufügen. Würde das bei Ihnen funktionieren?

Sie können also nach dem Befehl suchen. Markieren Sie den Text. Füge es mit der mittleren Maustaste ein und bearbeite es.

Es könnte einen besseren Weg geben, aber das funktioniert für mich.

Matt
quelle
0

Es gibt keinen Befehl zum automatischen Einfügen, Sie können jedoch jeden Befehl in einem Editor aufrufen, um ihn vor der Ausführung zu bearbeiten. Dies kann zu dem führen, wonach Sie suchen. Wenn Sie den Befehl jedoch beenden, wird er ausgeführt. Wenn Sie den Vorgang abbrechen möchten, sollten Sie den Bearbeitungspuffer löschen, bevor Sie den Editor beenden.

fc -e vi 372 372

johnshen64
quelle