Page 1 sur 1

La commande history et ses options.

Posté : ven. 6 août 2021 21:38
par tioker
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...

Code : Tout sélectionner

history
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

Code : Tout sélectionner

history --help
man history
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).

Code : 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 -c
Les premières bases de gestion de cette commande peuvent se résumer à

Code : 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
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

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'éditer
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

Code : Tout sélectionner

# toutes les commandes qui contiennent apt
history | grep apt
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

Code : Tout sélectionner

# recherche des commandes contenant apt dans les 20 dernières commandes
history 20 | grep apt
Maintenant, si on veut simplifier la commande par un alias (abréviation d'une commande complète) on peut écrire

Code : Tout sélectionner

alias hg='history | grep -i'
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

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
Autres options

On peut citer:

Code : Tout sélectionner

!?abcdefg?
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

Code : Tout sélectionner

!!:^
(ou la forme abrégée !^) pour désigner le premier argument de la dernière commande,

Code : Tout sélectionner

!!:*
(ou la forme abrégée !*) pour désigner tous les arguments de la dernière commande,

Code : Tout sélectionner

!!:$
(ou la forme abrégée !$) pour désigner le dernier argument de la dernière commande,

Code : Tout sélectionner

!n:m
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 :

Code : Tout sélectionner

HISTTIMEFORMAT="%d/%m/%Y %T "  # Format d'affichage date/heure des lignes de commande(s) enregistrées dans ~/.bash_history
Ci-dessous, un extrait de ce que ça donne dans le retour de la commande 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 
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.