Corriger votre dernière commande bash

Accueil Tags Recherche

Il m’arrive parfois de faire une petite faute, ou bien d’avoir à utiliser la même commande plusieurs fois de suite, avec de petites variations. Si la commande est longue, c’est toujours assez laborieux de devoir la modifier à la main.

Historique et substitution

La syntaxe la plus simple pour la répétition de la dernière commande, avec une substitution, est la suivante :

$ ^search^replace^

Par exemple, vous pouvez avoir utilisé la commande scp pour envoyer un dossier local sur un serveur distant :

$ scp -r ./folder1 user@host:/path/dest/

Mais vous avez un second dossier à envoyer. Plutôt que de retaper la commande précédente, ou de la modifier à grand renforts de flèches gauche, vous pouvez utiliser ceci :

$ ^folder1^folder2^

Syntaxe avancée

Dans le précédent exemple, nous n’avions qu’une seule substitution à faire. Cette syntaxe ne fonctionne malheureusement pas avec des modifications multiples. Reprenons le même exemple, mais modifions-le légèrement pour avoir ceci :

$ scp -r ./folder1/* user@host:/path/folder1

Il faut désormais faire une substitution globale (remplacer toutes les occurences de folder1).
L’autre syntaxe pour cette astuce est la suivante :

$ !!:s/search/replace/

Le double point d’exclamation !! permet de relancer la commande précédente (vous l’avez peut-être déjà utilisé comme ceci : sudo !!), et la suite de la commande se charge de la substitution. Là où cela devient intéressant, c’est qu’on peut préciser que cette dernière doit être globale :

$ !!:gs/folder1/folder2/
scp -r ./folder2/* user@host:/path/folder2

Il est aussi possible d’utiliser le symbole clé & dans vos subsitutions :

$ !!:s/folder1/&.back/
scp -r ./folder1.back/* user@host:/path/folder1

Voilà pour l’astuce du jour !
N’hésitez pas à partagez votre propre manière de faire dans les commentaires.