Supposons que j'ai l'exemple trivial suivant dans mon history
:
...
76 cd ~
77 ./generator.sh out.file
78 cp out.file ~/out/
79 ./out/cleaner.sh .
80 ls -alnh /out
...
Si je voulais exécuter des commandes 77
, 78
et 79
dans une commande, existe-t-il un raccourci pour cela? J'ai essayé !77 !78 !79
, qui les placera simplement tous sur une seule ligne à exécuter.
!77 ; !78 ; !79
va?!77-79
)Réponses:
EDIT: vous pouvez le faire de manière compatible POSIX avec l' outil de commande fix
fc
:Cela ouvrira votre éditeur (probablement
vi
) avec les commandes 77 à 79 dans le tampon. Lorsque vous enregistrez et quittez (:x
), les commandes seront exécutées.Si vous ne souhaitez pas les modifier et que vous êtes TRÈS SÛR de savoir quelles commandes vous appelez, vous pouvez utiliser:
Cela utilise
true
comme un "éditeur" pour éditer les commandes avec, il se ferme donc sans apporter de modifications et les commandes sont exécutées telles quelles.RÉPONSE ORIGINALE:
Vous pouvez utiliser:
Cela suppose que vous n'utilisez pas d'alias ou de fonctions ou de variables qui ne sont présentes que dans l'environnement d'exécution actuel, car bien sûr, ils ne seront pas disponibles dans le nouveau shell en cours de démarrage.
Une meilleure solution (merci à Michael Hoffman de me le rappeler dans les commentaires) est:
Un des très, très rares cas où cela
eval
est réellement approprié!Regarde aussi:
la source
cd
, mais c'est un cas de bord.eval "$(history -p \!{77..79})"
devrait marcher.Réponse simple: au lieu de
!77 !78 !79
,!77; !78; !79
pour faire ce que vous semblez faire - exécutez la commande 77, puis la commande 78, puis la commande 79, sans condition, ou!77 && !78 && !79
pour exécuter la commande 77 et vérifiez si elle a réussi. Et puis, si la commande 77 a réussi, exécutez la commande 78. Et puis, si la commande 78 a réussi, exécutez la commande 79.Réponse légèrement plus intelligente (si vous êtes dans une fenêtre de type terminal):
\!
dans votrePS1
.82 history
, votre prochaine commande est 83.!-6
. Cela réexécutera la commande 77.!-6
, copiez-le et collez-le. Puisque votre réexécution de la commande 77 (./generator.sh
) était la commande 83, vous êtes maintenant sur la commande 84, donc!-6
exécuterez donc de nouveau la commande 78.!-6
comme vous le souhaitez.la source