it-swarm.com.de

Wie führe ich aufeinanderfolgende Befehle aus dem Verlauf aus?

Angenommen, ich möchte eine Folge von vier Befehlen ausführen, die ich zuvor ausgeführt habe. Wenn der erste 432 in der Befehlshistorie ist, könnte ich Folgendes tun:

$ !432; !433; !434; !435

Ich bin gespannt, gibt es einen effizienteren Weg, dies zu erreichen?

50
Eric Wilson

Wenn es sich um Befehle handelt, die erst kürzlich ausgeführt wurden, besteht eine effizientere Möglichkeit darin, sie mit negativen Zahlen zu referenzieren:

!-4; !-3; !-2; !-1

Sobald Sie dies getan haben, enthält Ihr letzter Verlaufseintrag die gesamte Befehlskette, sodass Sie ihn mit !! Wiederholen können.


Bearbeiten: Wenn Sie es noch nicht getan haben, machen Sie sich mit der großartigen integrierten Funktion vertraut fc, erwähnt von Gilles. (Verwenden Sie help fc.) Es stellt sich heraus, dass Sie damit auch negative Zahlen verwenden können, sodass Sie das Gleiche wie oben tun können

eval "`fc -ln -4 -1`"

Dies hat jedoch eine Einschränkung: Danach wird die Zeile eval als letzter Befehl im Verlauf gespeichert. Wenn Sie dies also erneut ausführen, geraten Sie in eine Schleife!

Eine sicherere Möglichkeit hierfür ist die Verwendung des Standardbetriebsmodus fc: Leiten Sie den ausgewählten Befehlsbereich an einen Editor weiter und führen Sie ihn aus, sobald Sie ihn verlassen. Versuchen:

 fc -4 -1

Sie können sogar die Reihenfolge des Befehlsbereichs umkehren: fc -1 -4

49
rozcietrzewiacz

Verwenden Sie den integrierten Befehl fc , um eine Reihe von Befehlen im Verlauf anzuzeigen:

fc -ln 432 435

So führen Sie sie erneut aus:

eval "$(fc -ln 432 435)"

Es gibt eine nette und alternative Möglichkeit, eine Reihe von Befehlen nacheinander aus dem Bash-Verlauf auszuführen:
anstelle des Verlaufsersatzes (!432 oder !-4) können Sie den Verlauf mit durchsuchen Ctrl+rWenn Sie den ersten Befehl gefunden haben, den Sie ausführen möchten, drücken Sie Ctrl+o (operieren und als nächstes kommen) anstatt der return Schlüssel
Dies wird den Befehl starten und den nächsten vorschlagen aus dem Verlauf. Sie können schlagen Ctrl+o so oft du willst und beende die Sequenz entweder mit return für einen letzten oder Ctrl+c zu stoppen, ohne es zu starten.

10

Um die Befehle sofort auszuführen, anstatt sie zu bearbeiten, finden Sie hier eine syntaktisch schlankere Version von Giles antwortet mit eval :

fc -e: 432 435

Das Doppelpunktargument für -e ist das Bash Noop, das den von fc gewünschten Schritt "In einem Editor öffnen" überspringt. Außerdem enthält der (aktuelle) Verlauf jetzt die tatsächlichen Befehle aus dem Verlauf und nicht mehr die eval-Anweisung.

8
user1543542

fc für Schleife und xsel

Dies funktioniert gut, wenn ich die letzten n Befehle mehrmals verketten und erneut ausführen möchte:

fcn() (
  from="${1:-2}"
  to="${2:-1}"
  if [ "$from" -ne "$to" ]; then
    for i in `seq "$from" -1 "$(($to + 1))"`; do
      printf "$(fc -ln -${i} -${i}) && "
    done
  fi
  printf "$(fc -ln -${to} -${to})"
)

Dann:

$ echo a
a
$ echo b
b
$ echo c
c
$ fcn 3 1 | xsel -b
$ # Paste.
$  echo a &&  echo b &&  echo c
a
b
c
$ # Paste again if you feel like it.
$  echo a &&  echo b &&  echo c
a
b
c

Oder für größere Befehle, die möglicherweise bearbeitet werden müssen:

fcn 3 1 >cmds.sh
vi cmds.sh
bash cmds.sh
bash cmds.sh