Pour ceux qui ne le savent pas (ne riez pas, n'esquissez même pas un sourire, j'en ai connus), chaque commande que vous tapez dans un interpréteur de commande est conservée dans un fichier.

Il est donc possible de réutiliser, à l'aide d'autres commandes, celles qui ont été précédemment exécutées, afin d'éviter d'avoir le bout des doigts carrés à force de taper au clavier toujours les mêmes choses.

Tout le monde (ou presque, puisque j'en ai connu qui ne le savait pas) sait donc qu'il est possible de remonter dans l'historique de bash à l'aide des touches "flèche du haut" et "flèche du bas" du clavier.

Il y en a déjà moins qui savent qu'il est possible de se déplacer dans l'historique avec !.

Ainsi, !! permet de récupérer la dernière commande.

C'est très pratique lorsque la commande que l'on vient d'effectuer demande les droits super-administrateur alors que nous sommes simple utilisateur.

Un simple sudo !!<enter> et le problème est réglé.

La commande !N, ou N est un entier issue du résultat de la commande history, permet d’exécuter à nouveau la Nième commande.

Elle a aussi une subtile variation, beaucoup plus utile, !-N, qui permet de répéter la commande exécutée N commandes avant (pour ceux qui ont suivi, je confirme que !! est équivalent à !-1).

Autre commande que j'utilise régulièrement, ! suivie de une ou plusieurs lettres.

Cela permet de récupérer dans l'historique la dernière commande effectuée qui commence par ces lettres.

Ainsi, !cp permet de récupérer le dernier appel à cp.

Il est à noter que l'ajout de "\e[A": history-search-backward et "\e[B": history-search-forward dans votre fichier .inputrc vous permettra d'obtenir le même résultat en tapant cp suivi des touches "flèche du haut" ou "flèche du bas", mais en bonus, vous pourrez naviguer dans l'intégralité des commandes de votre historique débutant par cp.

Si vous recherchez dans l'historique une commande qui contient une chaîne de caractères précise mais qui ne se trouve pas au début de la commande, ? est votre ami.

Son utilisation, de la façon suivante, !?string?, vous permettra de récupérer cette fameuse commande.

Supposons maintenant que vous voulez éxécuter une commande en réutilisant les arguments d'une précédente commande.

C'est possible grâce à la combinaison de ! et de : de la manière suivante :

fch@diablo:~
51> echo 1 2 3 4
1 2 3 4
fch@diablo:~
52> echo !!:2
fch@diablo:~
52> echo 2
fch@diablo:~
53> echo !-2:3
fch@diablo:~
53> echo 3
3

En résumé, nous demandons à bash de récupérer le second argument de la dernière commande, et le troisième argument de l'avant-dernière commande.

Ce combo est très utile si vous êtes amené à faire des suites de chmod et de chown, par exemple.

Plus fin et plus fort, vous pouvez manipuler la valeur de l'argument récupéré, à l'aide des modificateurs :

fch@diablo:~
54> cp ../../fucking/long/path/to/config.php .
fch@diablo:~
54> mv !cp:1:s/config/param/ .

Nous demandons dans ce cas à bash de récupérer le premier argument de la dernière commande cp et de remplacer dans la valeur de cet argument config par param.

Évidement, il y a beaucoup de modificateurs différents, plus ou moins pratiques et adaptés à une situation donnée.

Pour ceux qui sont donc intéressés par le sujet, je les renvoit vers, je cite, the definitive guide to bash command-line history, qui les présente en détail, ainsi que beaucoup d'autres choses.