Comment gérer l’historique des commandes du shell Bash ?

Lorsque l’on est dans un terminal en ligne de commandes (shell Bash), on est souvent amené à rappeler des commandes que l’on a déjà entrées afin de la relancer ou d’y apporter une petite modification. Le réflexe standard c’est d’appuyer sur la touche flèche haut « ⇧ » ou alors « ctrl+p » afin de parcourir les commandes, mais il existe d’autres techniques beaucoup plus malignes et rapides.

La Commande Shell « history »

Cette commande permets d’afficher la liste des commandes enregistrées avec leurs numéro.

Cette commande peut prendre des paramètres

  • -c (clear) : supprime l’historique.
  • -d <num> (delete) : supprime l’entré N°<num>
  • -a (append) : ajoute la ligne au fichier d’historique

Pour connaître le fichier où est enregistré l’historique des commandes il faut entrer dans un terminal. 

$ echo $HISTFILE
/home/olivier/.bash_history

Ici le fichier contenu dans la variable $HISTFILE est « /home/olivier/.bash_history », c’est donc dans ce fichier que sont présente les commandes qui ont été entrées dans les différents terminaux.

Réglages de l’historique

Il est possible de définir le nombre de commandes en mémoire, en général on trouve dans le fichier ~/.bashrc

HISTSIZE=10000
HISTFILESIZE=200000

Leur nom est plutôt explicite, HISTSIZE est le nombre maximum de lignes de commandes en mémoire de la session Bash courante, HISTFILESIZE est le nombre de lignes de commandes qui peuvent être contenues dans le fichier $HISTFILE.

L’opérateur « ! »

Cet opérateur permet pas mal de chose (c’est même un véritable couteau Suisse) ici nous verrons les principales utilisations.

Rappeler une commande avec son numéro : par exemple rappeler la commande N° 775 on fait simplement

!755

Cet opérateur peut aussi être utilisé pour rappeler la dernière commande en entrant les premiers caractères de cette commande.

Ici on rappel la dernière commande de l’historique commençant par « ssh ».

!ssh

Il est aussi possible de rappeler les commandes par ordre décroissant

Ici on rappel la 5e commande de l’historique en partant de la fin.

!-5

Le raccourcis double ! permet de rappeler et exécuter directement la dernière commande.

Dans l’exemple si dessous on le précède de « sudo » afin de donner les droits à la commande précédent qui en avait besoin, on évite ainsi d’avoir à la rappeler explicitement.

apt install vlc
E: Impossible d'ouvrir le fichier verrou /var/lib/dpkg/lock-frontend - open (13: Permission non accordée)
sudo !!

L’historique avec de multiples sessions Bash

Si comme moi vous avez toujours 3 ou 4 terminaux d’ouvert il faut s’assurer que histappend soit bien activé, pour ce faire il faut ajouter la ligne suivante dans le fichier ~/.bashrc

shopt -s histappend

Sans cela le seul historique qui sera sauvegardé sera celui du dernier terminal à être fermé

Il est parfois utile de rappeler dans le terminal 3 (par exemple) la commande qu’on a entrée dans le terminal 1 par défaut ce n’est pas possible car chaque terminal a son propre historique de commande (celui-ci étant synchronisé avec le fichier qu’à la fermeture du terminal).

Une astuce consiste donc à ajouter au fichier d’historique la commande actuelle et de recharger ce fichier dans la mémoire du terminal à chaque fois qu’on valide une commande (touche entrer). Pour ce faire on ajoute dans le fichier ~/.bashrc la ligne suivante

export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Dans cette commande « history -a » (append) ajoute la dernière commande « history -c » (clear) supprime la mémoire d’historique du terminal et « history -r » (reload) recharge le fichier dans la mémoire.

Ainsi si on veut appeler dans un terminal une commande entrée dans un autre il suffit d’appuyer une seule fois sur la touche entrer, ce qui aura pour effet de recharger le fichier d’historique dans le terminal courant, puis de simplement faire défiler les commandes précédentes elles apparaîtront comme si vous veniez de les entrer dans ce terminal.

Ctrl+r la combinaison ultime

Parcourir l’historique des commandes peut être très fastidieux si celle que l’on cherche a été entrée il y a longtemps. Pour combler cela il existe un outil de recherche très puissant.

Pour l’activer il suffit d’entrer la combinaison Ctrl+r

Ensuite entrer une partie (n’importe laquelle) du texte que contient la commande que l’on recherche

Puis de faire défiler les propositions en faisant Ctrl+r à nouveau

Si par erreur vous passer la commande qui vous intéresse il faut faire Ctrl+s (attention lire la note ci-dessous) pour faire défiler dans l’autre sens.

NOTE : Sur encore plusieurs terminaux la commande Ctrl-s suspend l’activité du terminal, c’est une ancienne fonction que l’on utilise presque plus avec les terminaux modernes, pour débloquer le terminal il faut faire Ctrl+q, et pour désactiver la fonction de suspension il faut ajouter au fichier ~/.bashrc la commande

stty -ixon

Un petit truc bien pratique

Parfois on commence à écrire une commande puis on se dit que ce serait bien de récupérer une ancienne qui ressemble pour la modifier. Dans ce cas le premier réflexe est de supprimer ce qu’on a déjà commencé, puis faire ctrl+r et recommencer, mais il existe une manière plus rapide qui évite de retaper le début de la commande.

Comme on peut le voir sur la vidéo ci dessus, une fois qu’on s’est rendu compte qu’on voulait retrouver une ancienne commande, il suffit de faire :

ctrl+a pour aller au début de ligne,

ctrl+r pour lancer la recherche,

ctrl+y pour coller la dernière entrée non validée,

Cela a pour effet de lancer la recherche inverse, donc à ce moment il suffit de faire défiler les propositions en faisant ctrl+r

Donc pour aller plus vite, simplement se souvenir de la composition ctrl+aryr

 

Olivier Munier

Depuis ma plus tendre enfance j'ai toujours été attiré par les domaines techniques et les appareils électroniques. Très vite je me suis intéressé à l'informatique et j'ai eu mon premier PC en 1992. Au début des années 2000, j'ai découvert Linux et le monde des logiciels libres et open source. Assez vite j'ai décidé de me spécialiser sur ce vaste monde afin de devenir un expert. Titulaire d'un master en Informatique, mes compétences couvrent un très large éventail, notamment l'administration système et réseau Linux, la virtualisation et la programmation C, Shell et surtout Python. Sur ce site je partage mes connaissances, réalisations et avis sur tout un tas de domaines mais particulièrement l'informatique, l'électronique et la geekitude.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *