La commande history et ses options.
Posté : ven. 6 août 2021 21:38
Commande history
Généralités
En mode terminal, toutes les commandes passées sont enregistrées dans un fichier historique ¹. On peut aisément les retrouver en utilisant la flèche haut ou bas mais une commande permet de manipuler plus aisément l'historique, c'est la commande...
Cette commande liste en les numérotant toutes les dernières commandes passées, qu'elles soient dans la session active ou les précédentes. Elle offre de multiples options qui peuvent être consultées dans l'aide en ligne ou le manuel Linux
Il est important de connaitre dès le départ une notion primordiale. À l'ouverture de la session, l'historique est chargé en mémoire (ou fichier temporaire). Les nouvelles commandes seront ajoutées à ce fichier temporaire et écrites dans le fichier historique à la fin de session à moins qu'on fasse deux choses (et peut-être d'autres).
Les premières bases de gestion de cette commande peuvent se résumer à
Mais attention on reprend les commandes mais on les exécute aussi, ce qui peut être gênant.
Pour éviter l'exécution de la commande on peut suffixer notre rappel avec ":p" qui mettra la commande choisie à la fin de l'historique sans l'exécuter. On la retrouvera (pour la compléter ou la modifier) avec une simple flèche haute
grep
La recherche d'une commande par le point d'exclamation ne prend que celle dont on fournit le numéro ou la dernière qui commence par le terme. Si on veut toutes les commandes qui contiennent un mot précis, on peut utiliser l'option grep sous la forme
Et donc on pourra reprendre la commande voulue par son numéro pour la ré-exécuter ou l'éditer (avec :p).
Comme vu précédemment, en faisant suivre le mot history par un nombre, on appliquera la recherche aux seuls n derniers enregistrements
Maintenant, si on veut simplifier la commande par un alias (abréviation d'une commande complète) on peut écrire
ce qui nous offrira une nouvelle commande hg (comme history | grep).
En enfin, si on veut que cette abréviation soit permanente, on la mettra dans le fichier $HOME/.bash_aliases (il semble préférable de laisser le fichier .bashrc à l'état d'origine au moins pour les alias personnels).
Pour résumer
Autres options
On peut citer: rappelle la dernière commande qui contient abcdefg (et non pas qui commence par). À utiliser avec ":p"
exécutera la xième commande depuis la fin (attention, bien compter...)
rappel la dernière commande (à l'identique de la flèche haute)
- et d'autres...
Les arguments
Là ce sont des options avancées (ou la forme abrégée !^) pour désigner le premier argument de la dernière commande,
(ou la forme abrégée !*) pour désigner tous les arguments de la dernière commande,
(ou la forme abrégée !$) pour désigner le dernier argument de la dernière commande,
pour désigner l’argument m de la commande de numéro n.
On pourra bien sûr appliquer ces options avancées à la dernière commande (!!) ou à la commande n° n (!n).
Horodatage du fichier history (@pastille)
Notre ami @pastille me rapporte une astuce qui permet de compléter la commande history; je la livre telle qu'il l'a écrite car je n'ai rien à y ajouter.
Cette astuce concerne la commande history et consiste à créer une variable d'environnement nommée HISTTIMEFORMAT
ce qui va permettre de voir s'afficher dans le retour de la commande history la date/heure à laquelle les lignes de commandes enregistrées ont été entrées.
Pour ça, j'ai ajouté dans mon fichier ~/bashrc la ligne de commande suivante :
Ci-dessous, un extrait de ce que ça donne dans le retour de la commande history :
ATTENTION
Si un fichier history non horodaté existe déjà, toutes les anciennes commandes le seront avec la date et l'heure du jour; les suivantes seront à leur bonne date.
¹ Les curieux peuvent jouer avec les fichiers historiques et leurs paramètres en consultant cet article.
Généralités
En mode terminal, toutes les commandes passées sont enregistrées dans un fichier historique ¹. On peut aisément les retrouver en utilisant la flèche haut ou bas mais une commande permet de manipuler plus aisément l'historique, c'est la commande...
Code : Tout sélectionner
historyCode : Tout sélectionner
history --help
man historyCode : Tout sélectionner
# forcer l'écriture des commandes de la session dans le fichier historique physique
history -w
# purger l'historique du fichier temporaire (mais pas du fichier physique) depuis le début de session ou la dernière écriture (history -w)
history -cCode : Tout sélectionner
# liste les 20 dernières commandes
history 20
# reprendre et exécuter la commande n° 123
!123
# reprendre et exécuter la dernière commande commençant par un ou plusieurs mot⋅s⋅ (nano dans l'exemple)
!nano
!nano /etc
Pour éviter l'exécution de la commande on peut suffixer notre rappel avec ":p" qui mettra la commande choisie à la fin de l'historique sans l'exécuter. On la retrouvera (pour la compléter ou la modifier) avec une simple flèche haute
Code : Tout sélectionner
# rappel de la commande 328 ou celle commençant par nano sans l'exécuter
!328:p
!nano:p
# un flèche haute permet de la reprendre et de l'éditerLa recherche d'une commande par le point d'exclamation ne prend que celle dont on fournit le numéro ou la dernière qui commence par le terme. Si on veut toutes les commandes qui contiennent un mot précis, on peut utiliser l'option grep sous la forme
Code : Tout sélectionner
# toutes les commandes qui contiennent apt
history | grep aptComme vu précédemment, en faisant suivre le mot history par un nombre, on appliquera la recherche aux seuls n derniers enregistrements
Code : Tout sélectionner
# recherche des commandes contenant apt dans les 20 dernières commandes
history 20 | grep aptCode : Tout sélectionner
alias hg='history | grep -i'
En enfin, si on veut que cette abréviation soit permanente, on la mettra dans le fichier $HOME/.bash_aliases (il semble préférable de laisser le fichier .bashrc à l'état d'origine au moins pour les alias personnels).
Pour résumer
Code : Tout sélectionner
# mon alias créé, je recherche les commandes contenant "apt"
hg apt
# je sélectionne la commande qui m'intéresse et la met à la fin de mon historique
!227:p
# j'utilise la flèche haute pour la reprendre, l'adapter et l'exécuter
On peut citer:
Code : Tout sélectionner
!?abcdefg?Code : Tout sélectionner
!-xCode : Tout sélectionner
!!- et d'autres...
Les arguments
Là ce sont des options avancées
Code : Tout sélectionner
!!:^Code : Tout sélectionner
!!:*Code : Tout sélectionner
!!:$Code : Tout sélectionner
!n:mOn pourra bien sûr appliquer ces options avancées à la dernière commande (!!) ou à la commande n° n (!n).
Horodatage du fichier history (@pastille)
Notre ami @pastille me rapporte une astuce qui permet de compléter la commande history; je la livre telle qu'il l'a écrite car je n'ai rien à y ajouter.
Cette astuce concerne la commande history et consiste à créer une variable d'environnement nommée HISTTIMEFORMAT
ce qui va permettre de voir s'afficher dans le retour de la commande history la date/heure à laquelle les lignes de commandes enregistrées ont été entrées.
Pour ça, j'ai ajouté dans mon fichier ~/bashrc la ligne de commande suivante :
Code : Tout sélectionner
HISTTIMEFORMAT="%d/%m/%Y %T " # Format d'affichage date/heure des lignes de commande(s) enregistrées dans ~/.bash_history
Code : Tout sélectionner
471 05/12/2025 11:06:39 man --pager='less -p “^APPEL”' bash
472 05/12/2025 11:07:01 man bash
473 05/12/2025 11:35:26 man history
474 05/12/2025 11:36:40 less bash_logHistory
475 05/12/2025 11:36:03 mc
476 05/12/2025 11:56:36 history Si un fichier history non horodaté existe déjà, toutes les anciennes commandes le seront avec la date et l'heure du jour; les suivantes seront à leur bonne date.
¹ Les curieux peuvent jouer avec les fichiers historiques et leurs paramètres en consultant cet article.