bash, utilisation des commandes bang !

2016-02-11

Voici un gros post concernant les commandes bang de bash.

Je connaissais “!!”, “!ligne” et “!commande” ce qui est déjà pas mal. Mais il y en a bien d’autres !!!

En les connaissant et les utilisant, il doit être possible de minimiser les contacts avec la souris ;)

Les commandes :

Syntaxe
      
      !!              Exécute la dernière commande
      !509            Exécute la commande 509 de l'historique
      !-2             Exécute l'avant dernière commande 
      !foo            Exécute la dernière commande qui commance par 
                      'foo' (cad. !ls)
      !foo:p          Affiche la commande que !foo exécuterait et 
                      l'ajoute à l'historique
      !$              Exécute le dernier mot de la dernière commande 
                      (identique à Alt + .)
      !$:p            Affiche la commande que !$ exécuterait
      !*              Exécute la commande précédente sans le premier 
                      mot (cad la commande)
      !*:p            Affiche la commande que !* exécuterait
      ^foo^bar        Exécute la commande précédente en remplaçant 
                      'foo' par 'bar' dans le premier mot

Modificateurs de mots

      !509:2:h        Supprime le nom du fichier à la fin du chemin dans 
                      le 2e argument de la commande 509 de l'historique
      !509:2:t        Supprime le début du chemin jusqu'au nom du fichier 
                      dans le 2e argument de la commande 509 de l'historique
      !509:2:r        Supprime l'extension dans le 2e argument de la 
                      commande 509 de l'historique
      !509:2:e        Ne garde que l'extension du le 2e argument de la 
                      commande 509 de l'historique
      !509:2:gs/a/x/  Remplace les 'a' par des 'x' dans le 2e argument 
                      de la commande 509 de l'historique

Quelques cas d’usage simples :

$ touch a b c d e
$ !!
touch a b c d e
$ ls !:3
ls c
c
$ history | tail -n 3
  515  touch a b c d e
  516  ls c
  517  history | tail -n 3
$ ls !515:$ !516:^:p
ls e c
$ for a in !515:*; do echo $a; done
for a in a b c d e; do echo $a; done
a
b
c
d
e
$ history | tail -n 3
  518  ls e c
  519  for a in a b c d e; do echo $a; done
  520  history | tail -n 3
$ !ls
ls e c
c  e
$ ^ls^rm
rm e c
$ history | tail -n 6
  518  ls e c
  519  for a in a b c d e; do echo $a; done
  520  history | tail -n 3
  521  ls e c
  522  rm e c
  523  history | tail -n 6
$ !-3
ls e c
ls: impossible d'accéder à e: Aucun fichier ou dossier de ce type
ls: impossible d'accéder à c: Aucun fichier ou dossier de ce type
$ !-3:$:p
c
$ !523
history | tail -n 6
  521  ls e c
  522  rm e c
  523  history | tail -n 6
  524  ls e c
  525  c
  526  history | tail -n 6
$

D’autres cas d’usage avec modification des paramètres

$ ls /usr/local/lib/python3.4/dist-packages/aiohttp/client.py
/usr/local/lib/python3.4/dist-packages/aiohttp/client.py
$ !$:h:p
/usr/local/lib/python3.4/dist-packages/aiohttp
$ ls /usr/local/lib/python3.4/dist-packages/aiohttp/client.py
/usr/local/lib/python3.4/dist-packages/aiohttp/client.py
$ !$:t:p
client.py
$ ls /usr/local/lib/python3.4/dist-packages/aiohttp/client.py
/usr/local/lib/python3.4/dist-packages/aiohttp/client.py
$ !$:r:p
/usr/local/lib/python3.4/dist-packages/aiohttp/client
$ ls /usr/local/lib/python3.4/dist-packages/aiohttp/client.py
/usr/local/lib/python3.4/dist-packages/aiohttp/client.py
$ !$:e:p
.py
$ !-2:s/.py/.old/:p
ls /usr/local/lib/python3.4/dist-packages/aiohttp/client.old

Sources :