TL; DR: alias @@='$($(fc -ln -1) |& tail -1)'
Bash Geschichte Interaktionsmöglichkeiten bieten keinen Mechanismus , um die zu untersuchen Ausgabe von Befehlen. Die Shell speichert das nicht und die Verlaufserweiterung ist speziell für Befehle, die Sie selbst ausführen lassen, oder Teile dieser Befehle.
Dies lässt den Ansatz, den letzten Befehl erneut auszuführen und sowohl stdout als auch stderr ( |&
) in eine Befehlssubstitution zu leiten . heemayls Antwort erreicht dies, kann jedoch nicht in einem Alias verwendet werden, da die Shell die Verlaufserweiterung vor dem Erweitern von Aliasen und nicht danach durchführt.
Ich kann die Verlaufserweiterung auch nicht in einer Shell-Funktion zum Laufen bringen, selbst wenn ich sie in der Funktion mit aktiviere set -H
. Ich vermute, dass !!
eine Funktion niemals erweitert wird, und ich bin mir nicht sicher, wohin sie erweitert werden würde, aber im Moment bin ich mir nicht sicher , warum dies nicht der Fall ist.
Wenn Sie die Dinge so einrichten möchten, dass Sie dies mit sehr wenig Eingabe tun können, sollten Sie daher die integrierte fc
Shell anstelle der Verlaufserweiterung verwenden, um den letzten Befehl aus dem Verlauf zu extrahieren. Dies hat den zusätzlichen Vorteil, dass es auch dann funktioniert, wenn die Verlaufserweiterung deaktiviert ist.
Wie in gezeigt Gordon Davisson ‚s Antwort auf eine Alias Erstellen enthält Bash Geschichte Erweiterung (auf Super User ), $(fc -ln -1)
simuliert !!
. Anstecken diese in für !!
in heemayl Befehl $(!! |& tail -1)
ergibt:
$($(fc -ln -1) |& tail -1)
Dies funktioniert wie $(!! |& tail -1)
, kann aber in einer Alias-Definition enthalten sein:
alias @@='$($(fc -ln -1) |& tail -1)'
Nachdem Sie diese Definition ausgeführt oder in .bash_aliases
oder .bashrc
eingefügt und eine neue Shell gestartet haben, können Sie einfach @@
(oder wie auch immer Sie den Alias genannt haben) eingeben, um zu versuchen, die letzte Ausgabezeile des letzten Befehls auszuführen.
ek@Io:~$ alias @@='$($(fc -ln -1) |& tail -1)'
ek@Io:~$ evolution
The program 'evolution' is currently not installed. You can install it by typing:
sudo apt-get install evolution
ek@Io:~$ @@
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
evolution-common evolution-data-server evolution-data-server-online-accounts
....