Lorsque vous utilisez fréquemment la ligne de commande Linux, l'utilisation efficace de la commande history peut être un gain de productivité majeur.
Sous Linux, il existe une commande très utile pour vous montrer toutes les dernières commandes qui ont été récemment utilisées. La commande s'appelle simplement history
.
Afficher l'horodatage
Généralement, lorsque vous tapez history
en ligne de commande, par défaut, vous voyez un nombre suivi des commandes que vous avez utilisées récemment. À des fins d'audit, il peut être avantageux d'afficher l'horodatage avec la commande, comme indiqué ci-dessous.
Pour activer l'horodatage dans history
sortie de la commande, vous devez configurer le HISTTIMEFORMAT
Variable bash.
export HISTTIMEFORMAT="%F %T "
history | more
1 2020-06-25 19:02:39 systemctl restart network
2 2020-06-25 19:02:43 exit
3 2020-06-25 19:02:47 id
4 2020-06-25 19:02:56 cat /etc/hosts
Rechercher l'historique des commandes
Il s'agit peut-être de la fonctionnalité la plus fréquemment utilisée de l'history
commande . Lorsque vous avez déjà exécuté une commande très longue, vous pouvez simplement rechercher l'historique à l'aide d'un mot clé et réexécuter la même commande sans avoir à la saisir entièrement.
- Appuyez sur
Control+R
et tapez le mot-clé. - Appuyez sur Entrée lorsque vous voyez votre commande, qui exécutera la commande à partir de l'historique.
Dans l'exemple suivant, j'ai recherché host
, qui affichait la commande précédente cat /etc/hosts
dans l'historique qui contenait le mot host
.
(reverse-i-search)`host': cat /etc/hosts
cat /etc/hosts
#<ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost server1
::1 localhost.localdomain localhost server1
Parfois, vous souhaitez modifier une commande de l'historique avant de l'exécuter. Par exemple, vous pouvez rechercher systemctl
, qui affichera systemctl restart network
depuis l'historique des commandes, sélectionnez cette commande (en appuyant sur ESC
clé) et modifiez le restart
pour stop
.
Puis réexécutez-le à nouveau en appuyant simplement sur Enter
.
(reverse-i-search)`systemctl': systemctl stop network
systemctl stop network
Répéter la dernière commande exécutée
Parfois, vous pouvez finir par répéter les commandes précédentes pour diverses raisons. Voici les 4 façons différentes de répéter la dernière commande exécutée.
- Utilisez la
up arrow
pour afficher la commande précédente et appuyez sur Entrée pour l'exécuter. - Tapez
!!
et appuyez sur entrée depuis la ligne de commande - Tapez
!-1
et appuyez sur Entrée depuis la ligne de commande. - Appuyez sur
Control+P
affichera la commande précédente, appuyez sur Entrée pour l'exécuter.
Exécuter une commande spécifique
Dans l'exemple suivant, si vous souhaitez répéter la commande #4, vous pouvez faire !4
comme indiqué ci-dessous.
history | more
systemctl restart network
exit
id
cat /etc/hosts
!4
cat /etc/hosts
#<ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost server1
::1 localhost.localdomain localhost server1
Exécuter la commande précédente qui commence par un mot spécifique
Tapez !
suivi des premières lettres de la commande que vous souhaitez réexécuter. Dans l'exemple suivant, en tapant !ps
et enter, exécuté la commande précédente commençant par ps
, qui est ps aux | grep yp
.
!ps
ps aux | grep yp
root 16947 0.0 0.1 36516 1264 ? Sl 13:10 0:00 ypbind
root 17503 0.0 0.0 4124 740 pts/0 S+ 19:19 0:00 grep yp
Limiter le nombre d'éléments d'historique
Ceci est contrôlé par le HISTSIZE
et HISTFILESIZE
variables de shell Bash intégrées. Ajoutez les deux lignes suivantes à votre ~/.bashrc
fichier et déconnectez-vous, puis reconnectez-vous.
HISTSIZE=1500
HISTFILESIZE=1500
En conséquence, maintenant history
est configuré pour stocker 1500 commandes.
Modifier le nom du fichier d'historique
Par défaut, history
est stocké dans ~/.bash_history
fichier.
Ajoutez la ligne suivante au .bash_profile
fichier et reconnectez-vous au shell Bash, pour stocker la commande d'historique dans .my_commandline
fichier au lieu de .bash_history
fichier.
HISTFILE=/root/.my_commandline
Ceci est utilisé lorsque vous souhaitez suivre les commandes exécutées à partir de différents terminaux en utilisant un nom de fichier d'historique différent.
Éliminer l'entrée répétée continue de l'historique
Dans l'exemple suivant pwd
a été tapé trois fois, lorsque vous faites l'historique, vous pouvez voir les 3 occurrences continues de celui-ci. Pour éliminer les doublons, définissez HISTCONTROL
à ignoredups
comme indiqué ci-dessous.
history | tail -4
44 pwd
45 pwd
46 pwd
47 history | tail -4
export HISTCONTROL=ignoredups
history | tail -3
56 export HISTCONTROL=ignoredups
57 pwd
58 history | tail -4
Effacer les doublons dans tout l'historique
Les ignoredups
ci-dessus supprime les doublons uniquement s'il s'agit de commandes consécutives. Pour éliminer les doublons sur tout l'historique, définissez le HISTCONTROL
à erasedups
comme indiqué ci-dessous.
export HISTCONTROL=erasedups
pwd
systemctl restart network
history | tail -3
38 pwd
39 systemctl restart network
40 history | tail -3
ls -l
systemctl restart network
history | tail -6
35 export HISTCONTROL=erasedups
36 pwd
37 history | tail -3
38 ls -l
39 systemctl restart network
40 history | tail -6
Forcer l'historique à ne pas se souvenir d'une commande particulière
Lorsque vous exécutez une commande, vous pouvez instruire history
pour ignorer la commande en définissant HISTCONTROL
à ignorespace
et en tapant un espace devant la commande comme indiqué ci-dessous.
Je peux voir beaucoup d'administrateurs système juniors s'enthousiasmer à ce sujet, car ils peuvent masquer une commande de l'historique. Il est bon de comprendre comment ignorespace
œuvres. Mais, en tant que bonne pratique, ne cachez pas délibérément quoi que ce soit de l'histoire.
export HISTCONTROL=ignorespace
ls -ltr
pwd
systemctl restart network #Note that there is a space at the beginning of service, to ignore this command from history
history | tail -3
67 ls -l
68 pwd
69 history | tail -3
Effacer tout l'historique précédent
Parfois, vous voudrez peut-être effacer tout l'history
précédent , mais que vous souhaitez faire avancer l'historique.
history -c
Remplacer les mots des commandes d'historique
Lorsque vous effectuez une recherche dans l'history
, vous voudrez peut-être exécuter une commande différente mais utiliser le même paramètre de la commande que vous venez de rechercher.
Dans l'exemple ci-dessous, le !!:$
à côté du vi
commande obtient l'argument de la commande précédente à la commande actuelle.
ls nginx.conf
nginx.conf
vi !!:$
vi nginx.conf
Dans l'exemple ci-dessous, le !^
à côté de la commande vi obtient le premier argument de la commande précédente (c'est-à-dire cp
commande) à la commande actuelle (c'est-à-dire vi
commande).
cp nginx.conf nginx.conf.bak
vi !^
vi nginx.conf
Remplacer un argument spécifique par une commande spécifique
Dans l'exemple ci-dessous, !cp:2
recherche la commande précédente dans l'historique qui commence par cp et prend le deuxième argument de cp et le remplace par la commande ls -l comme indiqué ci-dessous.
cp ~/longname.txt /really/a/very/long/path/long-filename.txt
ls -l !cp:2
ls -l /really/a/very/long/path/long-filename.txt
Dans l'exemple ci-dessous, !cp:$
recherche la commande précédente dans l'historique qui commence par cp et prend le dernier argument (dans ce cas, qui est également le deuxième argument comme indiqué ci-dessus) de cp et le remplace par la commande ls -l comme indiqué ci-dessous.
ls -l !cp:$
ls -l /really/a/very/long/path/long-filename.txt
Désactiver l'utilisation de l'historique
Si vous souhaitez désactiver l'history
tous ensemble et que vous ne voulez pas que le shell Bash se souvienne des commandes que vous avez tapées, définissez le HISTSIZE
à 0 comme indiqué ci-dessous.
export HISTSIZE=0
Ignorer les commandes spécifiques de l'historique
Parfois, vous ne voudrez peut-être pas encombrer votre historique avec des commandes de base telles que pwd
et ls
. Utilisez HISTIGNORE
pour spécifier toutes les commandes que vous souhaitez ignorer de l'historique.
Veuillez noter que l'ajout de ls
à l'HISTIGNORE
ignore uniquement ls
et non ls -l
. Vous devez donc fournir la commande exacte que vous souhaitez ignorer de l'historique.
export HISTIGNORE="pwd:ls:ls -ltr:"
pwd
ls
ls -l
systemctl restart network
history | tail -3
79 export HISTIGNORE="pwd:ls:ls -l:"
80 systemctl restart network
81 history
[Note that history did not record pwd, ls and ls -l]
Pour en savoir plus sur l'history
commande sous Linux, consultez sa page de manuel.