Dans Bash, il existe des opérateurs pratiques pour répéter des parties de la dernière commande:
!^se développe au premier argument de la commande précédente, par exemple,$ echo one "two three" one two three $ echo !^ echo one one!$se développe jusqu'au dernier argument de la commande précédente, par exemple,$ echo one "two three" one two three $ echo !$ echo "two three" two three!*se développe à tous les arguments de la commande précédente, par exemple,$ echo one "two three" one two three $ echo !* echo one "two three" one two three
(Pour autant que je sache, ce sont du sucre syntaxique pour !!:^, !!:$et !!:*respectivement, où se !!trouve un désignateur d'événement qui se développe à la commande précédente, et ^, $et *sont des désignateurs de mots, voir le manuel de référence Bash ou man bash.)
Ce sont souvent très pratiques. Mais cela devient encore plus cool avec des raccourcis clavier:
Lorsque vous appuyez sur Alt+ .ou Alt+ _, le dernier argument de la commande précédente est inséré dans la commande actuelle, de la même manière que si vous aviez écrit
!$à ce stade.Il est également possible d'appuyer sur Alt+ Ctrl+ ypour insérer le premier argument de la commande précédente, comme si vous l'aviez écrit
!^à ce moment-là.
(Voir la bibliothèque GNU Readline ou info readline.)
J'ai tendance à préférer les raccourcis clavier aux opérateurs d'historique de Bash, car je peux voir ce que j'insère avant d'exécuter la commande. Cependant, il ne semble pas y avoir de raccourci qui me permette d'insérer tous les mots de la commande précédente, c'est-à-dire celui qui fait !*l'affaire. Au moins, je ne pouvais pas le trouver.
Existe-t-il un tel raccourci? Sinon, est-il possible de configurer la bibliothèque readline pour en ajouter une, et comment?
zsh, si vous tapez echo !*et appuyez sur TAB, vous obtenez l'effet souhaité. En général, TAB en ligne de lecture étendra tous les éléments extensibles. Très utile; bash aura probablement une configuration au même effet? @Seth, je pense que c'est la ligne de lecture dans bash, pas l'émulateur de terminal - pas sûr cependant.
man bash(quelque part sur la ligne 3030)
\e.et \e_sont mappés à la fonction readline yank-last-arget \e\C-ysont mappés à yank-nth-arg. Malheureusement, il ne semble pas y avoir de commande (unique) qui ajoute plusieurs arguments précédents à la fois.