GNU/Linux >> Tutoriels Linux >  >> Linux

Commandes Bash bang :une astuce incontournable pour la ligne de commande Linux

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

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.]


Linux
  1. 8 conseils pour la ligne de commande Linux

  2. Avoir une vache à la ligne de commande Linux

  3. Enfermez-vous sur la ligne de commande Linux

  4. Astuces Bash pour tous les jours en ligne de commande

  5. Yoda - L'assistant personnel en ligne de commande pour votre système Linux

Ripgrep - L'outil de recherche de ligne de commande le plus rapide pour Linux

Les 40 commandes de serveur Linux utiles pour les débutants et les professionnels

Les 50 commandes IP Linux utiles pour les administrateurs réseau

5 commandes pour afficher le contenu d'un fichier en ligne de commande Linux

Commandes Linux et Unix Tee pratiques pour l'administrateur Linux

Quatre navigateurs Web pour la ligne de commande Linux