GNU/Linux >> Tutoriels Linux >  >> Linux

15 exemples d'extension de l'historique Linux Bash à connaître

L'historique de Bash est très puissant. Comprendre comment utiliser efficacement les extensions de l'historique bash vous rendra extrêmement productif sur la ligne de commande Linux.

Cet article explique 15 exemples qui utilisent les fonctionnalités suivantes d'extension de l'historique bash :

  • Désignateurs d'événement - Fait référence à une commande particulière dans l'historique. Ça commence par un !
  • Désignateurs de mots :font référence à un mot particulier d'une entrée d'historique. Généralement, cela est combiné avec un désignateur pair. Même les désignateurs et les désignateurs de mots sont séparés par deux-points
  • Modificateurs – Modifie le résultat de la substitution effectuée par les désignateurs d'événements ou de mots

Cet article fait partie de notre série de tutoriels Bash en cours.

Comme vous le savez déjà, pour afficher toutes les entrées de l'historique, utilisez la commande history. Cela affichera toutes les commandes qui ont été exécutées précédemment avec le numéro de cette commande dans la table d'historique.

$ history
1 tar cvf etc.tar /etc/
2 cp /etc/passwd /backup
3 ps -ef | grep http
4 service sshd restart
5 /usr/local/apache2/bin/apachectl restart

Désignateurs d'événements d'historique de bash

1. Exécuter une commande spécifique de l'historique en utilisant !n

Si vous avez déjà exécuté une commande, au lieu de la ressaisir, vous pouvez l'exécuter rapidement en utilisant le numéro correspondant de la commande dans l'historique.

Par exemple, pour exécuter la commande #4, procédez comme suit. Cela affichera la commande #4 de l'historique et l'exécutera immédiatement.

$ !4
service sshd restart

Pour exécuter une commande qui a été tapée 2 commandes en arrière, procédez comme suit.

$ !-2

Pour exécuter la commande précédente, effectuez l'une des actions suivantes :

$ !!

$ !-1

Vous pouvez également appuyer sur -P (si vous êtes dans le mode emacs par défaut) pour accéder à la commande précédente.

Si vous avez activé l'édition de style vi pour la ligne de commande à l'aide de 'set -o vi', utilisez -k pour accéder à la commande précédente.

2. Exécutez une commande avec des mots-clés en utilisant !string et !?string

Vous pouvez également utiliser des mots-clés pour exécuter une commande à partir de l'historique.

L'exemple suivant recherchera la commande précédente qui COMMENCE par le mot-clé "ps" et exécutez-le. Dans cet exemple, il récupère la commande précédente « ps -ef | grep http" et l'exécute.

$ !ps
ps -ef | grep http

L'exemple suivant recherchera la commande précédente qui CONTIENT le mot-clé « apache » et exécutez-le. Dans cet exemple, il récupère la commande précédente "/usr/local/apache2/bin/apachectl restart" et l'exécute.

$ !?apache
/usr/local/apache2/bin/apachectl restart

3. Remplacez une chaîne de la commande précédente en utilisant ^str1^str2^

Dans l'exemple suivant, nous avons d'abord exécuté la commande ls pour vérifier un fichier. Plus tard, nous avons réalisé que nous voulions afficher le contenu du fichier. Au lieu de retaper le nom complet du fichier, nous pouvons simplement remplacer le "ls" dans la commande précédente par "cat" comme indiqué ci-dessous.

$ ls /etc/cron.daily/logrotate

$ ^ls^cat^
cat /etc/cron.daily/logrotate

Remarque :Pour obtenir des conseils supplémentaires sur l'historique de bash, reportez-vous à 15 Exemples pour maîtriser l'historique de la ligne de commande Linux. Cela explique comment afficher l'horodatage dans l'historique et comment utiliser diverses variables d'environnement liées à l'historique, notamment HISTTIMEFORMAT, HISTSIZE, HISTFILE, HISTCONTROL et HISTIGNORE

Désignateurs de mots de l'historique de Bash

Les désignateurs de mots sont très utiles lorsque vous souhaitez saisir une nouvelle commande, mais utilisez l'argument de l'une des commandes exécutées précédemment. Certains des exemples sont présentés ci-dessous.

4. Obtenez le 1er argument d'une commande en utilisant :^

Dans l'exemple suivant, "!cp:^" a été donné comme argument à la commande "ls -l". "!cp:^" localise la commande précédente dans l'historique qui commence par "cp" et obtient le 1er argument de cette commande.

$ cp /etc/passwd /backup

$ ls -l !cp:^
ls -l /etc/passwd

L'exemple suivant obtient le 1er argument de la commande précédente.

$ ls -l !!:^

5. Récupère le dernier argument d'une commande en utilisant :$

Dans l'exemple suivant, "!cp:$" a été donné comme argument à la commande "ls -l". "!cp:$" localise la commande précédente dans l'historique qui commence par "cp" et obtient le dernier argument de cette commande.

$ cp /etc/passwd /backup

$ ls -l !cp:$
ls -l /backup

L'exemple suivant obtient le dernier argument de la commande précédente.

$ls -l !!:$

6. Récupère le nième argument d'une commande en utilisant :n

Dans l'exemple suivant, "!tar:2" a été donné comme argument à la commande "ls -l". "!tar:2" localise la commande précédente dans l'historique qui commence par "tar" et obtient le 2ème argument de cette commande.

$ tar cvfz /backup/home-dir-backup.tar.gz /home

$ ls -l !tar:2
ls -l /backup/home-dir-backup.tar.gz

7. Obtenez tous les arguments d'une commande en utilisant :*

Dans l'exemple suivant, "!cp:*" a été donné comme argument à la commande "ls -l". "!cp:*" localise la commande précédente dans l'historique qui commence par "cp" et obtient tous ses arguments.

$ cp /etc/passwd /backup

$ ls -l !cp:*
ls -l /etc/passwd /backup

8. Faites référence au mot récemment recherché en utilisant !%

Comme nous l'avons expliqué ci-dessus, le "!? apache" recherchera la commande d'historique précédente qui CONTIENT le mot-clé "apache" et l'exécutera.

$ /usr/local/apache2/bin/apachectl restart

$ !?apache
/usr/local/apache2/bin/apachectl restart

!% fera référence au mot entier correspondant au précédent "?" recherche.

Par exemple, si vous avez déjà recherché "? apache", le "!%" correspondra au mot entier "/usr/local/apache2/bin/apachectl". Notez que "/" est traité comme faisant partie d'un mot dans ce contexte.

Donc, dans ce cas, en exécutant ce qui suit, vous pouvez arrêter apache.

$ !% stop
/usr/local/apache2/bin/apachectl stop

9. Obtenir une plage d'arguments à partir d'une commande en utilisant x-y

Dans l'exemple suivant, "!tar:3-5" a été donné comme argument à la commande "ls -l". "!tar:3-5" localise la commande précédente dans l'historique qui commence par "tar" et obtient les arguments de 3 à 5.

$ tar cvf home-dir.tar john jason ramesh rita

$ ls -l !tar:3-5
ls -l john jason ramesh

Ce qui suit obtient tous les arguments de 2.

$ ls -l !tar:2-$

Veuillez noter ce qui suit :

  • !! :* Obtient tous les arguments de la commande précédente
  • !!:2* Obtient tous les arguments à partir du 2ème argument.
  • !!:2-$ Comme ci-dessus. Obtient tous les arguments à partir du 2ème argument.
  • !!:2- Obtient tous les arguments à partir du 2ème argument (sauf le dernier argument).

Modificateurs d'historique de bash

Les modificateurs sont donnés après les désignateurs de mots, comme expliqué dans les exemples ci-dessous.

10. Supprimer le nom du chemin de fin d'un mot en utilisant :h

Dans l'exemple suivant, « !!:$:h » prend le dernier argument de la commande précédente et supprime le nom du chemin de fin. Dans ce cas, il supprime le nom du fichier et n'obtient que le chemin complet.

$ ls -l /very/long/path/name/file-name.txt

$ ls -l !!:$:h
ls -l /very/long/path/name

11. Supprimez tous les noms de chemin d'accès d'un mot en utilisant :t

C'est exactement le contraire de l'exemple précédent.

Dans l'exemple suivant, « !!:$:t » prend le dernier argument de la commande précédente et supprime tous les noms de chemin de tête. Dans ce cas, il n'obtient que le nom du fichier.

$ ls -l /very/long/path/name/file-name.txt

$ ls -l !!:$:t
ls -l file-name.txt

12. Supprimez l'extension de nom de fichier d'un mot en utilisant :r

Dans l'exemple suivant, "!!:$:r" prend le dernier argument de la commande précédente et supprime uniquement le ".suffixe" (qui est ici l'extension du nom de fichier). Dans ce cas, il a supprimé .txt

$ ls -l /very/long/path/name/file-name.txt

$ ls -l !!:$:r
ls -l /very/long/path/name/file-name

13. Sed comme Substitution dans l'historique bash en utilisant :s/str1/str2/

Au lieu d'utiliser le "^original^replacement^" comme nous l'avons vu précédemment, nous pouvons également utiliser une substitution de type sed dans l'historique bash, comme indiqué dans l'exemple ci-dessous. Cela pourrait être facile à retenir. !! est d'appeler la commande précédente, ":s/original-string/replacement-string/" est la syntaxe de type sed pour remplacer une chaîne.

$ !!:s/ls -l/cat/

Vous pouvez également utiliser le drapeau g (avec le drapeau s) pour effectuer une substitution globale, comme indiqué ci-dessous. Ceci est utile lorsque vous avez mal saisi plusieurs mots et que vous souhaitez les modifier tous ensemble et exécuter à nouveau la commande.

Dans l'exemple suivant, par erreur, j'ai donné "password" deux fois (au lieu de passwd).

$ cp /etc/password /backup/password.bak

Pour résoudre ce problème, effectuez simplement l'historique global suivant comme substitution.

$ !!:gs/password/passwd/
cp /etc/passwd /backup/passwd.bak

14. Répétez la substitution rapidement en utilisant :&

Si vous avez déjà exécuté avec succès une substitution d'historique bash comme indiqué ci-dessus, vous pouvez répéter la même substitution rapidement en utilisant :&.

J'ai tapé par erreur "password" à nouveau au lieu de "passwd" dans une autre commande.

$ tar cvf password.tar /etc/password

Maintenant, au lieu de retaper la commande, ou de faire le "gs/password/passwd", je peux simplement utiliser ":&", qui réutilisera la dernière substitution. Utilisez ":g&" pour réutiliser la dernière substitution par globalement.

$ !!:g&
tar cvf passwd.tar /etc/passwd

15. Imprimer la commande sans l'exécuter en utilisant :p

Ceci est très utile lorsque vous effectuez une substitution d'historique complexe et que vous souhaitez afficher la commande finale avant de l'exécuter.

Dans l'exemple suivant, "!tar:3-:p", n'exécute pas vraiment la commande.

Puisque nous avons donné ":p" ici, il fait juste la substitution et affiche la nouvelle commande. Une fois que vous avez vérifié l'extension de l'historique bash, et si vous pensez qu'il s'agit de la commande que vous vouliez exécuter, supprimez le ":p" et exécutez-le à nouveau.

$ tar cvf home-dir.tar john jason ramesh rita

$ tar cvfz new-file.tar !tar:3-:p
tar cvfz new-file.tar john jason ramesh

Linux
  1. 7 Exemples de commandes Linux df

  2. 8 Exemples de commandes Linux TR

  3. Exemples de commande rm sous Linux

  4. Exemples de commandes ps sous Linux

  5. w Exemples de commandes sous Linux

Tutoriel de commande d'histoire Linux pour les débutants (8 exemples)

Commande d'historique sous Linux avec des exemples

Comment activer l'horodatage dans l'historique de Bash sous Linux

La commande Bash Echo expliquée avec des exemples sous Linux

5 astuces simples pour l'historique de Bash que tout utilisateur de Linux devrait connaître

Exemples de commandes id sous Linux