Gibt es eine Verknüpfung zum Wiederholen des zweiten Befehls in Bash?

8

Wir alle wissen, dass !!dies den letzten Befehl wiederholen kann, den Sie in Bash ausführen.

Aber manchmal müssen wir eine Operation wie machen

$ python test.py
$ vim test.py

$ python test.py # here is where I need to repeat the second proximate bash command

Ich kann dazu die Aufwärtspfeiltaste verwenden, aber dazu muss ich meine rechte Hand in eine unbequeme Position bringen. Also frage ich mich, ob es einen Befehl gibt, der gerne !!funktionieren würde?

Zen
quelle
Verwenden Sie diese Ctrl+POption im Emacs-Modus (Standard) oder kim Vi-Modus, wenn Sie nicht nach der Aufwärts-Taste greifen möchten.
Stéphane Chazelas
Ich würde eigentlich beide Befehle in eine Zeile schreiben vim test.py && python test.py, um nicht mit mehreren Befehlen im Verlauf herumzuspielen, aber Sie können einfach "\ep": previous-historyIhre Befehle einbinden, ~/.inputrcsodass Sie Alt + p anstelle der Aufwärts-Taste drücken können.
Tijagi

Antworten:

5

Sie können verwenden !-2:

$ echo foo
foo
$ echo bar
bar
$ !-2
echo foo
foo

Das kann in Ihrer rechten Situation nicht helfen.

Sie können auch die !stringVerlaufssuche für diese Art von Fall verwenden:

$ python test.py
$ vim test.py
$ !py
python test.py # Printed, then run

Dies kann bequemer zu bedienen sein. Es wird ausgeführt:

Der letzte Befehl vor der aktuellen Position in der Verlaufsliste, beginnend mit Zeichenfolge .

Auch !pwürde einfach funktionieren. Sie können !?stringdie gesamte Befehlszeile und nicht nur den Start durchsuchen.

Michael Homer
quelle
Es ist viel besser! Da die Pfeiltasten Ihr gesamtes Handgelenk bewegen müssen und! -2 nur Fingerbewegungen erfordert, ausgezeichnet, Michael. Wow, lies einfach den zweiten Teil, es liegt außerhalb meiner Erwartungen. Du bist ein Zauberer!
Zen
Sie können auch eine direkte Verlaufserweiterung für Ihre Eingabe durchführen, indem Sie Bashs "Verlaufserweiterungszeile" Alt + ^ oder "Shellerweiterungszeile" Alt + Strg + e (auch Aliase) verwenden, um Bezeichner / zu erweitern. Modifikatoren und überprüfen Sie, bevor Sie die Eingabetaste drücken. Wenn Sie zum Beispiel echo Hello World!vier Zeilen im Verlauf zurück hatten und echo! -4 und dann Alt- ^ eingegeben haben, erhalten Sie die Erweiterung des !-4sofort und sehen, dass echo Hello World erweitert und bereit wartet. Weitere Informationen zu diesen Bezeichnern und Modifikatoren finden Sie in der Manpage für Bash. Suchen Sie zunächst nach "Ereignisbezeichnern".
ConceptRat
4
!-2

Mehr Spaß ist vorhanden. Angenommen, Sie möchten eine Datei weiter bearbeiten (wie oben, wo Sie test.py wiederholt verwenden):

cp foo.py thing.py
edit $_
python $_
!-2
^thing^foo
  • Kopieren Sie eine vorhandene Datei nach thing.py
  • Bearbeiten (vim, emacs - obwohl ich keine Ahnung habe, warum Sie eine Befehlszeile verwenden würden, wenn Sie Emacs-OS ausführen würden) thing.py- das letzte Wort in der vorherigen Befehlszeile
  • python thing.py
  • Bearbeiten thing.py
  • Bearbeiten foo.py

Die Manipulation der Geschichte macht so viel Spaß. Versuchen Sie es man history. Beachten Sie, dass die Suche nach einer Wiederverwendung des Verlaufs dazu führen kann, dass weit mehr als der Befehl selbst eingegeben wird. Die letzte Befehlsersetzung, bei der ich thing.py durch foo.py ersetze, ist ein solches Beispiel. Weniger Zeichen, um nur den Befehl und den Namen einzugeben. :) :)

Die Ersetzung des Verlaufs ist auch der Grund, warum Sie beim Versuch seltsame Nachrichten erhalten:

$ echo "This is a disaster!"
-bash: !": event not found

Das Ausrufezeichen wird als Verlaufsreferenz verwendet und kann keinen vorherigen Befehl mit einem doppelten Anführungszeichen finden.

JezC
quelle
Übrigens, wenn ich das Echo 'xxx' habe, wie kann ich jedes 'x' durch 'y' ersetzen?
Zen
Eine Zeichenfolge durch eine andere ersetzen? Nur das? !!:1gs/x/y/
JezC
Obwohl persönlich, würde ich schauen$(echo !! | sed -e s/x/y/g)
JezC
Die Verwendung von sed wäre zu umständlich. Kann ich in ^ x ^ y einen Parameter oder ein Symbol hinzufügen, um diesen Job zu erledigen?
Zen