Angenommen, ich habe das folgende triviale Beispiel in meinem history
:
...
76 cd ~
77 ./generator.sh out.file
78 cp out.file ~/out/
79 ./out/cleaner.sh .
80 ls -alnh /out
...
Wenn ich wollte , um Befehle auszuführen 77
, 78
und 79
in einem Befehl, Gibt es eine Abkürzung für das? Ich habe versucht !77 !78 !79
, die einfach alle in einer einzigen Zeile auszuführen.
!77 ; !78 ; !79
okay!77-79
Antworten:
BEARBEITEN: Sie können dies POSIX-konform mit dem Befehlstool fix ausführen
fc
:Dies öffnet Ihren Editor (wahrscheinlich
vi
) mit den Befehlen 77 bis 79 im Puffer. Wenn Sie speichern und beenden (:x
), werden die Befehle ausgeführt.Wenn Sie sie nicht bearbeiten möchten und SEHR SICHER sind, welche Befehle Sie aufrufen, können Sie Folgendes verwenden:
Dies wird
true
als "Editor" verwendet, um die Befehle mit zu bearbeiten. Es wird nur beendet, ohne dass Änderungen vorgenommen werden, und die Befehle werden so ausgeführt, wie sie sind.URSPRÜNGLICHE ANTWORT:
Sie können verwenden:
Dies setzt voraus, dass Sie keine Aliase oder Funktionen oder Variablen verwenden, die nur in der aktuellen Ausführungsumgebung vorhanden sind, da diese natürlich in der neu gestarteten Shell nicht verfügbar sind.
Eine bessere Lösung (danke an Michael Hoffman, der mich in den Kommentaren erinnert hat) ist:
Einer der ganz wenigen Fälle, in denen
eval
es tatsächlich angebracht ist!Siehe auch:
quelle
cd
ist jedoch ein Randfall.eval "$(history -p \!{77..79})"
sollte arbeiten.Einfache Antwort: statt
!77 !78 !79
,!77; !78; !79
, um das zu tun, was Sie zu tun versuchen - führen Sie den Befehl 77 und dann den Befehl 78 und dann den Befehl 79 bedingungslos aus, oder!77 && !78 && !79
, um den Befehl 77 auszuführen und zu prüfen, ob er erfolgreich war. Wenn der Befehl 77 erfolgreich war, führen Sie den Befehl 78 aus. Wenn der Befehl 78 erfolgreich war, führen Sie den Befehl 79 aus.Etwas cleverere Antwort (wenn Sie sich in einem Terminal-Fenster befinden):
\!
in IhrePS1
.82 history
, lautet Ihr nächster Befehl 83.!-6
. Dadurch wird der Befehl 77 erneut ausgeführt.!-6
, kopieren Sie sie und fügen Sie sie ein. Da Ihre erneute Ausführung von Befehl 77 (./generator.sh
) Befehl 83 war, befinden Sie sich jetzt in Befehl 84 und!-6
führen Befehl 78 erneut aus.!-6
nach Wunsch.quelle