TL; DR: alias @@='$($(fc -ln -1) |& tail -1)'
Les fonctionnalités d'interaction de l'historique de Bash n'offrent aucun mécanisme pour examiner la sortie des commandes. Le shell ne stocke pas cela , et l'expansion de l'historique est spécifiquement pour les commandes que vous avez vous-même exécutées, ou des parties de ces commandes.
Cela laisse l'approche de réexécuter la dernière commande et de canaliser à la fois stdout et stderr ( |&
) dans une substitution de commande. La réponse de heemayl y parvient, mais ne peut pas être utilisée dans un alias car le shell effectue une expansion de l'historique avant de développer les alias, et non après.
Je ne peux pas non plus faire en sorte que l'expansion de l'historique fonctionne dans une fonction shell, même en l'activant dans la fonction avec set -H
. Je soupçonne !!
qu'une fonction ne sera jamais développée, et je ne sais pas à quoi elle serait développée si elle l'était, mais pour l'instant je ne sais pas exactement pourquoi elle ne l'est pas.
Par conséquent, si vous souhaitez configurer les choses afin de pouvoir le faire avec très peu de frappe, vous devez utiliser le fc
shell intégré au lieu de l'expansion de l'historique pour extraire la dernière commande de l'historique. Cela présente l'avantage supplémentaire de fonctionner même lorsque l'expansion de l'historique est désactivée.
Comme le montre la réponse de Gordon Davisson à Créer un alias contenant l'expansion de l'historique bash (sur Super User ), simule . Dans ce pour brancher dans la commande de heemayl les rendements:$(fc -ln -1)
!!
!!
$(!! |& tail -1)
$($(fc -ln -1) |& tail -1)
Cela fonctionne comme $(!! |& tail -1)
mais peut aller dans une définition d'alias:
alias @@='$($(fc -ln -1) |& tail -1)'
Après avoir exécuté cette définition, ou l'avoir placée dans .bash_aliases
ou .bashrc
et démarrer un nouveau shell, vous pouvez simplement taper @@
(ou tout ce que vous avez nommé l'alias) pour tenter d'exécuter la dernière ligne de sortie de la dernière commande.
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
....