La commande history sous linux
Sommaire
I. Présentation
La commande history est une commande POSIX (commune à toutes les distributions type Unix) qui permet de remonter dans les commandes que nous avons passées.
Il vous arrive probablement souvent de remonter vos commandes pour les réexecuter avec le "UP" (flèche du haut) de votre clavier, vous faites ainsi défiler l'ensemble des commande que vous avez exécutées. Cela est possible grâce à "history". En effet, quand vous passez une commande, celle-ci est stockée dans un fichier du nom de ".history" du répertoire "home/$User".Si l'utilisateur "paul" tape les commandes "ls"et "cd /", celles-ci seront stockées dans le fichier "/home/Paul/.history" et quand Paul voudra remonter dans ses commandes, c'est le processus et le fichier ".history" qui l'aideront.
II. La commande
Tapez la commande suivante pour voir vos dernières commandes passées:
history
Les commandes que vous verrez seront alors uniquement celles de l'utilisateur avec lequel vous êtes connecté. Pour voir les commandes d'un autre utilisateur, il faut aller ouvrir le fichier ".history" de son répertoire, dans une architecture de droit normale, vous n'y serez bien sur pas autorisé (mis à part si vous êtes root).
III. Le nombre d'entrées
Il faut savoir qu'history garde les 500 commandes (change selon les version et les distributions) les plus récentes et commence à effacer les plus anciennes une fois que le nombres maximum est dépassé.
Il est possible d'agrandir le nombre de commande stocké mais cela risque de ralentir votre shell.
Pour voir le nombre de commande qu'history peut stocker, entrez la commande:
echo $HISTSIZE
Pour changer ce nombre à 300 (par exemple):
export HISTSIZE=300
IV. Effacer ses traces
Pour vider votre fichier ".history" afin que root ou un utilisateur avec certains privilèges ne puisse plus voir les commandes que vous avez entrées, utilisez la commande:
history -c
- -c : clean
Un autre moyen est de supprimer le fichier ".history" dans votre répertoire "/home/user":
rm /home//.history
Il faut savoir que sous Linux, quand vous mettez un "." devant un fichier, cela le rend invisible. Cela explique pourquoi un simple "ls" n'affiche pas ce fichier, il faut utiliser "ls -a".
V. Utilisations supplémentaires
history permet comme je vous l'ai dit de remonter dans les commandes que vous avez entrées. Quelques raccourcis sont disponibles en plus du simple "UP" ou "DOWN" pour naviguer dans ses précédentes commandes. Cette commande permet de remonter dans ses commandes de manière plus rapide:
!n -3
Par exemple avec -3 pour retrouver l'avant avant avant dernière commande tapée. Il est ainsi possible de remonter jusqu’à $HISTSIZE commande:
!n 3
A l'inverse, sans le "-", on retrouve la troisième commande tapée. Cela perd de son intérêt quand nous avons tapé beaucoup de commandes car elles s'effacent une fois que l'HISTSIZE est dépassée. La commande suivante permet de trouver les commandes contenant un mot précis:
!?mot?
Par exemple pour retrouver les commandes qui contiennent le mot "doc" nous entrerons:
!?doc?
Beaucoup d'autres raccourcis peuvent être utilisés grâce à history, je vous invite à aller dans le man d'history pour y voir l'ensemble des possibilités:
man history
Hello,
Vraiment très bien ton site, mes félicitations !
Quelques précisions car c’est toujours mal expliqué :
history -c : N’enregistre pas les commandes tapées durant la session en cours dans le fichier .history
rm /home/.history : Supprime effectivement l’history mais les commandes tapées durant la session en cours seront ajoutées dans le fichier .history à la déconnexion
Très pratique à rajouter dans le .bashrc :
# Activation date et heure dans la commande history #
HISTTIMEFORMAT= »[%d/%m/%Y %T] »
Tcho !
Merci pour le tuto.
Cela m’a permis d’approfondir mes connaissances sur des outils
dont je me sers quotidiennement.
Je me demande certaines commande Linux(printenv , export etc…
En plus,la commande executee a partir de fichier script comme php,perl avec shell_exec() ) ne sont pas stockees dans le fichier .history.
Vous avez des idees sur ce probleme?
Bonjour,
J’aimerai avoir une explication de la gestion du fichier .bash_history.
Je vous remercie;
Anas Taib
Pour obtenir l’aide sur la commande history, ce n’est pas `man` qu’il faut utiliser, mais `help` car history est un builtin (de bash par exemple), pas un programme. Le `man history` n’a pas vraiment de rapport avec le builtin history en fait.
Merci à tous. Très utile.
Avec votre aide j’aimerais preparer memoire avec vous, un jour de devenir administrateur reseau en linux. Je serais ravi d’apprendre avec vous
Bonjour
après avoir afficher l’history des commandes utiliser précédemment, comment faire pour taper le nombre qui contient la commande je veut sans utiliser les bouton du clavier
merci
je ne sais pas comment les autres personne on compris mais jai rien obtenu en tapant !n -3 ou en l ajoutant a history comme argument quand on veut aider les gens on montre un visio de la complete de la commande
Merci pour votre commentaire, je perçois votre émoi. La commande complète est simplement « !n -3 » :
$ history
[…]
807 exit
808 sh
809 shellcheck /tmp/monscript.sh
810 netstat -petulan -3
811 history
$ !n -3
netstat -petulan -3 -3
Comme vous le voyez dans mon exemple, la commande permet de revenir 3 « sauts » en arrière en comptant la commande actuellement saisie, donc à la commande 810, qui est réexécutée dans la foulée.
Bonjour,
J’ai l’impression qu’il y a une erreur que j’ai constaté en exécutant le raccourci !n -3 sur debian 12.
Dans votre exemple, !n -3 cherche à exécuter la dernière commande commençant par n, et non de revenir en arrière de 3 commandes. Dans ce contexte, -3 est interprété comme un argument passé à la commande qui commence par n (dans ce cas, netstat). Bash ne comprend pas -3 comme une instruction pour remonter dans l’historique.
Donc, ce qui se passe est simplement que la commande netstat -petulan -3 -3 s’exécute avec -3 ajouté deux fois en argument, mais elle ne « revient » pas trois commandes en arrière. Pour revenir en arrière d’un certain nombre de commandes, la bonne syntaxe serait !-3, qui exécuterait la commande située trois lignes au-dessus dans l’historique, sans tenir compte de son contenu.