Finden Sie heraus, welcher Befehl, den ich zuletzt ausgeführt habe, auf eine bestimmte Weise gestartet wird?

8

In der Bash- !!Befehlszeilenumgebung können Sie Ihren letzten Befehl erneut ausführen. Sie können den Pfeil nach oben drücken, um den zuletzt ausgeführten Befehl anzuzeigen. Aber was ist, wenn Sie den letzten Befehl, den Sie ausgeführt haben und der auf eine bestimmte Weise begann , nur sehen, aber nicht ausführen möchten ?

bernie2436
quelle
1
Könnten Sie bitte Ihre Frage ändern. Mir ist immer noch nicht klar, was Sie fragen.

Antworten:

18

Wenn Sie den Verlauf über Ctrl+ durchsuchen rund einige Buchstaben des Befehls eingeben und nicht drücken, Entersondern drücken , wird der Befehl angezeigt und nicht ausgeführt. Eine andere Alternative ist:

history | grep 'mycommand'

Dieses nette Geschichts-Cheatsheet könnte auch helfen.

mkc
quelle
1
Und wenn Sie nicht nach dem ersten Spiel suchen und weiter rückwärts suchen möchten, drücken Sie immer wieder Strg-R. Und dies ist nur einer von vielen leistungsstarken Befehlen, die von der Bash History & Readline Library bereitgestellt werden.
Orion
Wenn Sie die verifizierte Antwort haben, ziehe ich meine und wenn Sie den "^.\{7\}pattern"Ausdruck in Ihrer Antwort verwenden möchten , können Sie dies gerne tun!
Wenn Sie mehrere Befehle bearbeiten und erneut fc ### ###
ausführen
9

Sie können die letzten Befehl ausgeführt zeigen, durch Anfügen :pan !!:

$ echo 123
123
$ !!:p
echo 123

Wenn Sie den letzten Befehl mit einem bestimmten Namen anzeigen möchten, verwenden Sie einen Ausruf:

$ echo 123
123
$ pwd
/home/cuonglm
$ !echo:p
echo 123
cuonglm
quelle
4

Soweit ich das beurteilen kann, ist jede Antwort hier nicht portierbar. Betrachten Sie für eine tragbare Option die POSIX-Garantie fc:

    $ man fc

−e editor Verwenden Sie den vom Editor benannten Editor , um die Befehle zu bearbeiten. Die Editorzeichenfolge ist ein Dienstprogrammname, der über die PATH- Variable gesucht werden muss... Der Wert in der FCEDIT- Variablen wird standardmäßig verwendet, wenn −e nicht angegeben wird. Wenn FCEDIT null oder nicht gesetzt ist, wird ed als Editor verwendet.

−l (Der Buchstabe ell.) Listen Sie die Befehle auf, anstatt einen Editor für sie aufzurufen. Die Befehle müssen in der durch den ersten und letzten Operanden angegebenen Reihenfolge geschrieben werden, die von −r beeinflusst wird , wobei jedem Befehl die Befehlsnummer vorangestellt wird.

−n Unterdrückt Befehlsnummern, wenn Sie mit −l auflisten.

−r Kehrt die Reihenfolge der aufgelisteten (mit −l ) oder bearbeitetenBefehle (weder mit −l noch mit −s ) um .

−s Führen Sie den Befehl erneut aus, ohne einen Editor aufzurufen.

OPERANDEN

first , last Wählen Sie die Befehle aus, die aufgelistet oder bearbeitet werden sollen. Die Anzahl der vorherigen Befehle, auf die zugegriffen werden kann, wird durch den Wert derVariablen HISTSIZE bestimmt. Der Wert des ersten oder letzten oder beider muss einer der folgenden sein:

[+ oder-] Nummer Eine positive (oder negative ) Nummer, die eine Befehlsnummer darstellt; Befehlsnummern können mit derOption −l angezeigt werden... Zum Beispiel ist −1 der unmittelbar vorherige Befehl ...

Wenn die Option −l zum Auflisten von Befehlen verwendet wird, muss das Format jedes Befehls in der Liste wie folgt sein:

    "%d\t%s\n", <line number>, <command>

Wenn sowohl die Optionen −l als auch −n angegeben sind, lautet das Format jedes Befehls wie folgt:

    "\t%s\n", <command>

Wenn die besteht aus mehr als einer Zeile, die Zeilen nach der ersten werden angezeigt als:

    "\t%s\n", <continued-command>

Verwenden Sie jedoch unbedingt -l oder -e, wenn Sie Ihre Befehle NUR anzeigen / bearbeiten möchten. Standardmäßig fcwird die in FCEDIT angeforderte Befehlsliste geöffnet (beachten Sie, dass sie sich von Ihrer EDITOR- Umgebungsvariablen unterscheidet), und wenn FCEDIT beendet wird, fcwerden die bearbeiteten Befehle ausgeführt.

Die Antwort auf diese Frage könnte jedenfalls lauten:

    % fc -l -1

Oder ohne Zeilennummern:

    % fc -ln -1

Oder die letzten fünf Befehle in umgekehrter Reihenfolge:

    % fc -lrn -1 -5

In Ihrem Pager:

    % fc -lrn -1 -5 |$PAGER

Für Ihren letzten Anruf bei fc:

    % fc -l fc
mikeserv
quelle
+1 für Mühe. Die Frage ist jedoch markiert bash
grebneke
Es funktioniert in bashund alles andere. Die Verwendung von bashschließt Portabilität nicht aus, wird aber sicherlich schlechte Gewohnheiten entwickeln.
Mikeserv
Die beste Antwort hier und sollte aufgrund der Portabilität die akzeptierte sein.
Wildeyes
2

Hit Ctrlrstarten Sie dann den Befehl , den Sie sehen möchten , tippen. Bash wird schrittweise abgeschlossen. Wenn Sie zufrieden sind, drücken Sie, um Enteres erneut auszuführen oder Ctrlgabzubrechen.

Glenn Jackman
quelle
2

Wenn Sie nur den letzten Befehl möchten, verwenden Sie:

 history | cut -c 8- | tail -n 2 | head -n 1 

Wenn Sie dies wiederholt tun möchten, setzen Sie ein Leerzeichen vor historyoder verwenden Sie:

 history | cut -c 8- | grep -Ev '^history' | tail -n 1

Wenn Sie nur den letzten Befehl sehen möchten, der mit pattern beginnt xyz:

 history | cut -c 8- | grep -E '^xyz'  | tail -n 1 

Dies funktioniert jedoch nicht, wenn das Muster die Anfangszeichen der "Geschichte" sind und Sie dann Folgendes benötigen:

history | cut -c 8- | grep -Ev 'history \|' | grep -E '^hist'  | tail -n 1 
Anthon
quelle
Es gibt einen Tippfehler bei Ihrer ersten Verwendung von cut.
Jon
1
bind '"\ep": history-search-backward'
bind '"\en": history-search-forward'

Und dann können Sie einen Text eingeben und dann Alt-pnach den letzten Befehlen suchen, die gleich beginnen (und Alt-pdurch Alt-nsie hin und her wechseln).

(Dies sind die Standardschlüsselbindungen für ähnliche Widgets in zsh)

Stéphane Chazelas
quelle
0

Fügen Sie diese Zeilen in eine Datei ein ~/.inputrc:

"\e[A": history-search-backward
"\e[B": history-search-forward

Dann source ~/.inputrcin Ihrer Shell (oder starten Sie die Shell einfach neu).

Jetzt können Sie einige Buchstaben des Befehls eingeben und dann mit den Aufwärts- / Abwärtspfeilen Befehle durchlaufen, die mit diesen wenigen Buchstaben beginnen.

wim
quelle