Comment utiliser la commande d'historique sous Linux
Le terminal Linux conserve un registre de chaque instruction que vous avez exécutée. Ce journal, que l'on peut explorer, permet de réutiliser des commandes antérieures. Une fois maîtrisée, la commande d'historique peut significativement améliorer votre efficacité.
Maîtriser l'historique des commandes
Comme l'a exprimé George Santayana, "Ceux qui ne peuvent se souvenir du passé sont voués à le répéter." Dans Linux, l'oubli du passé implique l'incapacité de répéter des actions, même désirées.
C'est là que l'utilité de la commande d'historique prend tout son sens. Elle permet non seulement de revoir, mais aussi de réutiliser vos commandes. Il ne s'agit pas seulement d'une question de commodité, mais aussi d'efficacité et de précision. Plus une commande est complexe, plus il est difficile de la mémoriser et de la saisir sans erreur, ce qui peut entraîner des dysfonctionnements ou des actions imprévues.
La commande historique résout ces problèmes. Comme beaucoup d'outils Linux, elle offre plus de possibilités qu'il n'y paraît. Son apprentissage peut grandement améliorer votre quotidien avec la ligne de commande Linux. C'est un investissement de temps judicieux, car il existe des méthodes plus efficaces que d'appuyer répétitivement sur la flèche vers le haut.
Fonctionnement de la commande historique
Dans sa forme la plus simple, vous activez la commande historique en tapant simplement son nom:
history
Ceci affichera une liste des commandes que vous avez précédemment utilisées dans votre terminal.

Les commandes sont numérotées, les plus récentes (avec les numéros les plus élevés) se trouvant à la fin de la liste.
Pour afficher un nombre spécifique de commandes, vous pouvez ajouter un argument numérique à la commande. Par exemple, pour voir les 10 dernières commandes, tapez:
history 10

Un résultat identique peut être obtenu en combinant la commande history avec la commande tail. Pour cela, entrez:
history | tail -n 10

Réutilisation des commandes
Pour exécuter une commande listée dans l'historique, saisissez un point d'exclamation (!) suivi du numéro de la commande, sans espace.
Par exemple, pour réexécuter la commande numéro 37, vous devrez écrire:
!37

Pour lancer à nouveau la toute dernière commande, entrez deux points d'exclamation (!!), toujours sans espaces:
!!

Ceci est particulièrement utile si vous oubliez d'utiliser sudo. Entrez sudo, un espace, puis les deux points d'exclamation et appuyez sur Entrée.
Dans l'exemple ci-dessous, nous avons lancé une commande nécessitant sudo. Au lieu de retaper toute la ligne, nous pouvons simplement saisir sudo !! :
mv ./my_script.sh /usr/local/bin/
sudo !!

Vous pouvez donc répéter une commande en utilisant son numéro ou la dernière commande avec les doubles points d'exclamation. Mais comment faire pour réutiliser la cinquième ou la huitième commande précédente?
Vous pouvez utiliser un point d'exclamation, un tiret (-) suivi du numéro de la commande précédente (toujours sans espace) pour l'exécuter à nouveau.
Pour réitérer la 13ème commande précédente, tapez :
!-13

Recherche par chaîne de caractères
Pour réexécuter la dernière commande commençant par une chaîne spécifique, entrez un point d'exclamation suivi de la chaîne (sans espace), puis appuyez sur Entrée.
Par exemple, pour relancer la dernière commande commençant par sudo, tapez:
!sudo

Il existe cependant un risque. Si la dernière commande commençant par sudo n'est pas celle que vous attendiez, vous lancerez la mauvaise commande.
Pour plus de sécurité, vous pouvez utiliser le modificateur :p (print), de cette façon :
!sudo:p

Cette option affiche la commande dans le terminal, sans l'exécuter. Cela permet de vérifier avant de l'utiliser. Si c'est la bonne, appuyez sur la flèche vers le haut, puis sur Entrée pour la lancer.
Pour rechercher une commande contenant une chaîne spécifique, utilisez un point d'exclamation et un point d'interrogation.
Par exemple, pour rechercher et lancer la première commande contenant le mot "alias", saisissez :
!?aliases

Ceci trouvera toute commande contenant "alias", quelle que soit sa position dans la ligne.
Recherche interactive
La recherche interactive vous permet de parcourir les commandes correspondantes et de sélectionner celle que vous souhaitez réutiliser.
Appuyez simplement sur Ctrl + r pour lancer la recherche.

Lorsque vous tapez un terme de recherche, la première commande correspondante apparaît. Les lettres que vous saisissez sont affichées entre des accents graves (`) et des apostrophes ('). Les commandes correspondantes sont mises à jour au fur et à mesure que vous tapez.

À chaque pression de Ctrl + r, la commande correspondante suivante est recherchée et affichée dans le terminal.

Lorsque vous appuyez sur Entrée, la commande affichée est exécutée.

Pour modifier une commande avant de l'exécuter, appuyez sur la flèche Gauche ou Droite.

La commande apparaît sur la ligne de commande, où vous pouvez la modifier.

Vous pouvez également utiliser d'autres outils Linux pour explorer l'historique. Par exemple, pour envoyer la sortie de history vers grep et rechercher les commandes contenant "Alias", tapez:
history | grep aliases

Modification rapide de la dernière commande
Si vous avez besoin de corriger une erreur de frappe, vous pouvez utiliser l'accent circonflexe (^) pour modifier la commande. C'est particulièrement utile lorsque vous avez mal orthographié un mot ou que vous voulez lancer une commande avec une option différente.
Pour utiliser cette fonctionnalité, tapez un accent circonflexe, le texte à remplacer, un autre accent circonflexe, le texte de remplacement, et un dernier accent circonflexe, puis appuyez sur Entrée.
Par exemple, supposons que vous ayez tapé la commande suivante, en écrivant accidentellement "shhd" au lieu de "sshd" :
sudo systemctl start shhd
Vous pouvez corriger cela simplement en tapant:
^shhd^sshd^

La commande est exécutée avec "shhd" corrigé en "sshd".
Suppression de commandes de l'historique
Vous pouvez également supprimer des commandes de l'historique avec l'option -d (delete). Il est inutile de conserver vos commandes mal orthographiées dans l'historique.
Vous pouvez utiliser grep pour trouver la commande, et transmettre son numéro à history avec l'option -d pour la supprimer, puis vérifier qu'elle a bien disparu :
history | grep shhd
history -d 83
history | grep shhd

Vous pouvez aussi transmettre une plage de commandes à l'option -d. Pour supprimer toutes les entrées de la liste 22 à 32 (inclus), saisissez :
history -d 22 32
Pour supprimer les cinq dernières commandes, utilisez un nombre négatif, comme ceci :
history -d -5
Mise à jour manuelle du fichier d'historique
Lorsque vous vous connectez ou ouvrez un terminal, l'historique est chargé depuis un fichier. Dans Bash, ce fichier s'appelle .bash_history.
Les modifications que vous effectuez durant votre session ne sont écrites dans ce fichier qu'à la fermeture du terminal ou à la déconnexion.
Si vous souhaitez ouvrir un autre terminal et accéder à l'historique complet, y compris les commandes du premier terminal, l'option -a (all) permet de mettre à jour manuellement le fichier depuis le premier terminal.
Pour ce faire, entrez ceci :
history -a

Les commandes sont écrites discrètement dans le fichier d'historique.
Pour enregistrer toutes les modifications (comme la suppression de commandes) dans le fichier, utilisez l'option -w (write) :
history -w

Effacer l'historique
Pour effacer toutes les commandes de l'historique, utilisez l'option -c (clear), comme ceci :
history -c

Pour forcer ces modifications dans le fichier, utilisez en plus l'option -w :
history -w
Sécurité et fichier d'historique
Si vous utilisez des applications nécessitant des informations sensibles (comme des mots de passe) sur la ligne de commande, sachez qu'elles sont aussi enregistrées dans l'historique. Pour éviter cela, vous pouvez supprimer immédiatement une commande après son exécution avec cette structure :
special-app my-secret-password;history -d $(history 1)
history 5

Cette structure est constituée de deux commandes séparées par un point-virgule (;). Explications :
- special-app : Le nom du programme que vous lancez.
- my-secret-password : Le mot de passe nécessaire pour cette application. Ceci termine la première commande.
- history -d : Dans la seconde commande, on utilise l'option -d (supprimer) de la commande history. Ce que l'on supprime est déterminé par la partie suivante.
- $(history 1) : Ceci est une substitution de commande. La partie entre parenthèses est exécutée dans un sous-shell, et son résultat est utilisé comme texte dans la commande principale. La commande history 1 retourne la dernière commande. On peut donc considérer la deuxième commande comme : history -d "dernière commande ici".
Vous pouvez utiliser history 5 pour vérifier que la commande contenant le mot de passe a bien été supprimée.
Il existe une méthode encore plus simple. Bash ignore les lignes commençant par un espace. Donc, il suffit d'ajouter un espace au début de la ligne :
special-app another-password
history 5

La commande avec le mot de passe n'est alors pas ajoutée à l'historique. Cette astuce fonctionne grâce à une configuration du fichier .bashrc.
Le fichier .bashrc
Le fichier .bashrc s'exécute à chaque ouverture de terminal ou connexion. Il définit également le comportement de la commande history. Ouvrons-le avec gedit.
Tapez :
gedit .bashrc

En haut du fichier, vous trouverez deux entrées :
- HISTSIZE : Le nombre maximum d'entrées que peut contenir l'historique.
- HISTFILESIZE : La limite du nombre de lignes que le fichier d'historique peut contenir.

Ces deux valeurs interagissent comme suit :
- Quand vous vous connectez ou ouvrez un terminal, la liste d'historique est remplie à partir du fichier .bash_history.
- Quand vous fermez le terminal, le nombre maximum de commandes défini dans HISTSIZE est enregistré dans le fichier .bash_history.
- Si l'option shell histappend est activée, les commandes sont ajoutées à .bash_history. Si histappend n'est pas défini, .bash_history est écrasé.
- Après l'enregistrement, le fichier d'historique est tronqué pour ne pas dépasser la valeur de HISTFILESIZE.
Toujours en haut du fichier, vous verrez la valeur HISTCONTROL.

Vous pouvez définir cette valeur pour obtenir les effets suivants :
- ignorepaces : Les lignes commençant par un espace ne sont pas ajoutées à l'historique.
- ignoredups : Les commandes dupliquées ne sont pas ajoutées à l'historique.
- ignoreboth : Active les deux options.
Vous pouvez aussi lister les commandes spécifiques que vous souhaitez exclure de l'historique. Séparez-les par deux points (:) et entourez-les de guillemets ("...")
Pour cela, ajoutez une ligne de cette forme à votre fichier .bashrc en remplaçant les commandes désirées :
export HISTIGNORE="ls:history"

Utilisation des horodatages
Pour ajouter des horodatages à la liste d'historique, vous pouvez utiliser le paramètre HISTIMEFORMAT. Ajoutez cette ligne à votre fichier .bashrc :
export HISTTIMEFORMAT="%c "
Notez l'espace avant le guillemet fermant. Ceci empêche l'horodatage de fusionner avec les commandes de la liste.
<img decoding="async" loading="lazy" class="alignnone wp-image-465312 size-full" src="https://toptips.fr/wp-content/uploads/2021/01/1610231662_137_Comment-utiliser-la-commande-dhistorique-sous-Linux.png" alt="Définition du format d'horodatage avec la variable 'HISTTIMEFORMAT'." width="646" height="255" onload="pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);" onerror="this.onerror=null;pagespeed.