A jamais oublié de lancer sudo
avant une commande ? Avez-vous déjà dû répéter une commande entière parce que vous aviez une faute de frappe ? Avez-vous déjà pensé que ce serait bien d'avoir des raccourcis pour répéter vos commandes précédentes ? Si cela vous ressemble, j'ai quelque chose à partager. Dans cet article, je vais vous montrer comment utiliser bash bang (!
), qui facilitent la répétition des commandes et corrigent les erreurs.
Principes de base de la répétition de commande
Bash donne accès à la liste des commandes que vous avez émises précédemment, connue sous le nom d'historique des commandes. La valeur de HISTSIZE
La variable définit le nombre de commandes enregistrées dans votre liste d'historique. Par défaut, cette valeur est 500. Ces commandes émises précédemment (appelées votre liste d'historique) sont stockées dans votre fichier d'historique. Son emplacement par défaut est ~/.bash_history
, et cet emplacement est stocké dans la variable shell HISTFILE
.
Sous le capot, les commandes bang (!) introduisent des commandes de votre liste d'historique bash dans le flux d'entrée. Cette fonctionnalité permet de répéter facilement des commandes, de remplacer du texte, de manipuler des arguments et de corriger rapidement les fautes de frappe dans vos commandes précédentes.
Exemples de répétition de commande
Voici quelques exemples de ce que vous pouvez faire avec bash bang.
Répéter la dernière commande correspondant au début d'une chaîne
Le coup (!
) suivi du premier caractère (ou chaîne) correspondant à la commande que vous souhaitez exécuter répétera l'instance la plus récente de cette commande :
$ ls
dir dir1 dir2 file file1 file2 hello.txt
$ !l
ls
dir dir1 dir2 file file1 file2 hello.txt
$ !ls
ls
dir dir1 dir2 file file1 file2 hello.txt
Répéter la dernière commande correspondant n'importe où dans une chaîne
Le !?<string>
format fait la même chose que ci-dessus, mais <string>
n'a pas besoin d'être au début de la commande :
$ cat hello.txt
Hello world ..!
$ !?hello.txt
cat hello.txt
Hello world ..!
Répétez la commande n de votre historique
Répéter la commande n de votre historique bash (en comptant à rebours depuis le haut) est aussi simple que d'utiliser un bang avec le nombre en question :
!10
Répéter la nième commande depuis votre dernière entrée d'historique
Répéter la commande n de votre historique bash (en comptant à partir du bas) est aussi simple que d'utiliser un bang avec un moins et le nombre en question :
!-10
Répéter la dernière commande
S'il y a une commande bang que j'utilise tout le temps, ce serait !!
. Le bang-bang (!!
) la commande répète la dernière commande de la liste d'historique, se comportant comme !-1
:
$ cat hello.txt
Hello world ..!
$ !!
cat hello.txt
Hello world ..!
Bang-bang (!!
) est utile lorsque vous devez répéter la commande précédente ou si vous devez préfixer sudo
, ou sortie de canal :
$ yum update
Loaded plugins: priorities, update-motd, upgrade-helper
You need to be root to perform this command.
$ sudo !!
sudo yum update
Loaded plugins: priorities, update-motd, upgrade-helper
$ ls
dir dir1 dir2 file file1 file2 hello.txt
$ !! | grep file
ls | grep file
file
file1
file2
$
Répéter mais remplacer une chaîne
Souvent, j'émets de longues commandes et les réémets avec différents commutateurs. Ou, je dois relancer une commande car il y avait une faute de frappe dans ma commande précédente. La substitution de chaîne me permet de le faire sans retaper toute la longue commande.
Il existe deux façons d'obtenir ce résultat. L'une consiste à utiliser :
!!:s^<old>^<new>
Cette structure substitue une chaîne à la commande précédente :
$ ls /etc/httpd/conf.d
autoindex.conf notrace.conf php.conf php-conf.7.2 README userdir.conf welcome.conf
$ !!:s^conf.d^conf
ls /etc/httpd/conf
httpd.conf magic
Vous pouvez même faire la même chose avec !<string>:s^<old>^<new>
:
$ !l:s^conf^conf.d
ls /etc/httpd/conf.d
autoindex.conf notrace.conf php.conf php-conf.7.2 README userdir.conf welcome.conf
Cette option est utile lorsque vous devez effectuer une substitution de chaîne pour une commande qui n'était pas la plus récente.
L'autre façon d'obtenir ce résultat est de passer par la structure ^<old>^<new>
. Ce format remplace les chaînes par la commande la plus récente, similaire à !!:s^<old>^<new>
:
$ cd /etc/httpd/conf.d
/etc/httpd/conf.d
/etc/httpd/conf.d $ ^conf.d^conf
cd /etc/httpd/conf
/etc/httpd/conf $
Répéter les arguments de la commande
Souvent, nous utilisons les mêmes arguments d'une commande précédente. Si vous avez un long argument, vous voudrez probablement le répéter avec la commande suivante. Regardons quelques commandes bash bang qui peuvent le faire pour nous.
Tout d'abord, le format !:n
répète l'argument n de la commande précédente, avec 0
étant la commande elle-même :
~/project $ ls -a -l
total 32
drwxrwxr-x 7 user user 4096 Sep 9 20:30 .
drwx------ 16 user user 4096 Sep 9 20:10 ..
drwxrwxr-x 2 user user 4096 Sep 9 16:02 dir
drwxrwxr-x 2 user user 4096 Sep 9 16:02 dir1
drwxrwxr-x 2 user user 4096 Sep 9 16:02 dir2
drwxrwxr-x 2 user user 4096 Sep 9 20:30 dir3
-rw-rw-r-- 1 user user 0 Sep 9 16:02 file
-rw-rw-r-- 1 user user 0 Sep 5 16:07 .file
-rw-rw-r-- 1 user user 0 Sep 9 16:01 file1
-rw-rw-r-- 1 user user 0 Sep 9 16:01 file2
-rw-rw-r-- 1 user user 16 Sep 9 16:03 hello.txt
drwxrwxr-x 2 user user 4096 Sep 5 16:08 .hidden_dir
-rw-rw-r-- 1 user user 0 Sep 5 16:08 .hidden_file
~/project $ ls !:1
ls -a
. .. dir dir1 dir2 dir3 file .file file1 file2 hello.txt .hidden_dir .hidden_file
Deuxièmement, !!:$
répète le dernier argument de la commande précédente. Vous pouvez raccourcir cette commande en !$
et $_
:
project $ mkdir dir3
project $ cd !$
cd dir3
project/dir3 $
Vous pourriez demander :"Et si je veux utiliser cette technique avec une commande que j'ai émise précédemment, mais pas la plus récente ?" Vous pouvez le faire avec les commandes bang, en utilisant soit :
!<command you've issued previously >:$
$ mkdir -p hello/test1/test2
$ ls !mkdir:$
ls hello/test1/test2
ou :
!<command you've issued previously >:n
$ ls !mk:2
ls hello/test1/test2
Imprimer les commandes
Parfois, vous voudrez peut-être imprimer la commande, mais vous ne voulez pas qu'elle soit exécutée. Vous pouvez accomplir cette tâche avec !:p
:
~/project $ cat hello.txt
Hello world ..!
~/project $ !:p
cat hello.txt
~/project $
En fait, vous pouvez imprimer n'importe quelle commande dans votre liste d'historique sans l'exécuter. Émettez simplement l'un des éléments suivants :
$ !<command>:p
$ !mkdir:p
mkdir -p hello/test1/test2
$ !<string>:p
$ !su:p
sudo yum check-update
$ !mk:p
mkdir -p hello/test1/test2
Rappeler les commandes avec reverse-i-search
En tant qu'administrateur système, vous émettez probablement des centaines de commandes chaque jour. Vous pourriez avoir du mal à vous rappeler certaines commandes ou à en rappeler une partie. Voici une autre option pour trouver celui dont vous avez besoin.
(reverse-i-search)`<search string>’: <output> (reverse-i-search)`yu': sudo yum check-update
(reverse-i-search)`cd': cd /etc
CTRL+R active reverse-i-search
, qui fournit une zone de recherche agréable, vous permettant de naviguer plus facilement dans votre historique.
Conclusion
Ce sont des bash bang utiles (!
) commandes que chaque administrateur système devrait connaître. Ces commandes vous font gagner beaucoup de temps et vous permettent de corriger rapidement les erreurs de commande. En savoir plus sur bash dans sa page de manuel, avec la commande man bash
.
[Vous voulez essayer Red Hat Enterprise Linux ? Téléchargez-le maintenant gratuitement.]