#1 Le 04/04/2018, à 12:25
- yoles
Code pour alléger l'historique du terminal
Bonjour,
J'utilise Ubuntu 16.04 et j'ai inséré un code à la fin du fichier ".bashrc" pour nettoyer l'historique des commandes du terminal, afin de retrouver facilement les commandes que j'utilise le plus souvent.
Ce code est le suivant :
cp $HOME/.bash_history $HOME/.bash_historyTMP
nl $HOME/.bash_historyTMP | sort -rn | sort -uk2 | sort -n | cut -f2 > $HOME/.bash_history
Il permet de supprimer les lignes identiques en gardant la plus récente.
Le problème c'est qu'avec ce code, si j'utilise par exemple les commandes suivantes :
sudo shred -fuvzn15 fichierA
sudo shred -fuvzn15 fichierB
sudo shred -fuvzn15 fichierC
Ces 3 entrées vont rester dans l'historique du terminal, or je souhaiterais améliorer mon code pour qu'il supprime ces 3 entrées et qu'il ne me conserve que la dernière entrée.
Avez-vous des suggestions ?
Je souhaiterais également savoir s'il y avait une commande qui permettait de ne pas conserver dans l'historique la dernière commande saisie.
En vous remerciant par avance pour toute aide.
Hors ligne
#2 Le 04/04/2018, à 12:52
- pingouinux
Re : Code pour alléger l'historique du terminal
Bonjour,
Essaye en remplaçant
... | sort -uk2 | ...
par
... | sort -uk2,2 | ...
Hors ligne
#3 Le 04/04/2018, à 13:03
- Watael
Re : Code pour alléger l'historique du terminal
salut,
quel intérêt de faire un tri numérique inverse si, derrière, tu fais un tri unique ? et alors, quel intérêt d'appeler nl d'abord ?
sort -uk1,1 hist.tmp >~/.bash_history
Dernière modification par Watael (Le 04/04/2018, à 13:04)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 04/04/2018, à 13:07
- credenhill
Re : Code pour alléger l'historique du terminal
hello
regarder les options de l'historique dans bash
HISTCONTROL
Une liste de valeurs, séparées par des virgules, controlant la manière dont les commandes sont enregistrées dans l'historique. Si la liste des valeurs contient la valeur ignorespace, les lignes commençant par un caractère d'espacement ne seront par mémorisées dans l'historique. Si elle contient la valeur ignoredups, une ligne correspondant exactement à la ligne de commande précédente ne sera pas dupliquée dans l'historique. La valeur ignoreboth permet de combiner ces deux comportements. Si elle contient la valeur erasedups, toutes les lignes précédant la ligne courante et lui correspondant seront retirées de l'historique avant que cette ligne n'y soit enregistrée. Toute valeur qui ne fait pas partie de la liste ci-dessus est ignorée. Si HISTCONTROL est détruite, ou si elle contient une valeur différente des trois mentionnées ci-dessus, tous les lignes lues par l'interpréteur seront mémorisées dans la liste d'historique, sous contrôle de HISTIGNORE. La seconde ligne et les suivantes d'une commande multiligne ne sont pas testées, et sont ajoutées dans l'historique quelque soit la valeur de HISTCONTROL.
Hors ligne
#5 Le 04/04/2018, à 14:02
- yoles
Re : Code pour alléger l'historique du terminal
Bonjour,
Essaye en remplaçant... | sort -uk2 | ...
par
... | sort -uk2,2 | ...
Merci pour la proposition, mais cette commande ne m'est pas satisfaisante car elle va supprimer beaucoup de lignes dans l'historique que je souhaiterais garder.
salut,
quel intérêt de faire un tri numérique inverse si, derrière, tu fais un tri unique ? et alors, quel intérêt d'appeler nl d'abord ?
sort -uk1,1 hist.tmp >~/.bash_history
L'intérêt d'appeler "nl" est de conserver l'ordre chronologique des commandes, ainsi les commandes les plus fréquemment utilisées pourront être réutilisées facilement en utilisant la flèche haut dans le terminal et ainsi éviter de les rechercher tout au fond de l'historique à chaque fois.
Pour faire cela il faut donc aussi faire un tri numérique inverse pour conserver la ligne avec le numéro le plus élevé.
En fait, ce que je souhaiterais précisément, c'est indiquer explicitement les commandes pour lesquelles je souhaiterais garder un nombre précis de mots. Pour l'exemple que j'ai donné dans mon premier message, je souhaiterais garder les trois premiers mots de la commande "sudo shred -fuvzn15 fichierA", ainsi quand je taperai plus tard "sudo shred -fuvzn15 fichierB" seule une ligne contenant "sudo shred -fuvzn15" sera conservée dans l'historique.
Cela est-il possible ?
Merci beaucoup.
Dernière modification par yoles (Le 04/04/2018, à 14:11)
Hors ligne
#6 Le 04/04/2018, à 14:09
- yoles
Re : Code pour alléger l'historique du terminal
hello
regarder les options de l'historique dans bash
HISTCONTROL
Une liste de valeurs, séparées par des virgules, controlant la manière dont les commandes sont enregistrées dans l'historique. Si la liste des valeurs contient la valeur ignorespace, les lignes commençant par un caractère d'espacement ne seront par mémorisées dans l'historique. Si elle contient la valeur ignoredups, une ligne correspondant exactement à la ligne de commande précédente ne sera pas dupliquée dans l'historique. La valeur ignoreboth permet de combiner ces deux comportements. Si elle contient la valeur erasedups, toutes les lignes précédant la ligne courante et lui correspondant seront retirées de l'historique avant que cette ligne n'y soit enregistrée. Toute valeur qui ne fait pas partie de la liste ci-dessus est ignorée. Si HISTCONTROL est détruite, ou si elle contient une valeur différente des trois mentionnées ci-dessus, tous les lignes lues par l'interpréteur seront mémorisées dans la liste d'historique, sous contrôle de HISTIGNORE. La seconde ligne et les suivantes d'une commande multiligne ne sont pas testées, et sont ajoutées dans l'historique quelque soit la valeur de HISTCONTROL.
Merci c'est très utile, finalement en positionnant HISTCONTROL à HISTCONTROL=erasedups mon code devient inutile. Cependant ça ne répond pas au problème que je souhaite résoudre ici.
Dernière modification par yoles (Le 04/04/2018, à 14:50)
Hors ligne
#7 Le 05/04/2018, à 20:10
- yoles
Re : Code pour alléger l'historique du terminal
Finalement la variable HISTCONTROL positionnée à "erasedups" enlève les lignes identiques pour la session courante mais n'enregistre pas les modifications dans le fichier ".bash_history". Donc à l'ouverture d'un nouveau terminal on se retrouve avec l'historique non modifié.
Personne n'a de suggestions pour mon problème initial ?
Merci d'avance pour toute aide.
Dernière modification par yoles (Le 05/04/2018, à 20:11)
Hors ligne
#8 Le 05/04/2018, à 20:54
- Watael
Re : Code pour alléger l'historique du terminal
ça ne modifie pas l'historique déjà écrit, ça modifie l'historique lors qu'il est écrit.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 05/04/2018, à 21:35
- yoles
Re : Code pour alléger l'historique du terminal
Oui, avec "HISTCONTROL=erasedups" si tu écris "sudo apt update" dans deux sessions différentes, tu auras 2 entrées "sudo apt update" dans l'historique, donc ce n'est pas terrible. Mais si tu relis mon premier post j'ai inséré un code dans le fichier ".bashrc" qui permet de résoudre ce problème,mais je souhaiterais améliorer ce code pour résoudre les problèmes que j'ai évoqués dans les précédents post. Merci d'avance si tu as des suggestions.
Hors ligne
#10 Le 26/04/2018, à 10:08
- maxire
Re : Code pour alléger l'historique du terminal
Salut,
Je déterre ce sujet, dans la version en anglais de info bash j'ai:
'HISTCONTROL'
A colon-separated list of values controlling how commands are saved
on the history list.
colon = : et non virgule, donc problème de traduction.
Ensuite, par défaut .bash_history devrait être écrasé par l'historique de la session courante et ce n'est pas le cas d'où l'inefficacité de l'option erasedups (comme ignoredups d'ailleurs) ==> Bug potentiel ou bien j'ai raté quelque chose!
Maxire
Archlinux/Mate + Ubuntu 22.04 + Archlinux/Gnome sur poste de travail
Hors ligne
#11 Le 26/04/2018, à 12:09
- yoles
Re : Code pour alléger l'historique du terminal
salut,
Je ne pense pas que ce soit un bug, sinon ça aurait été très probablement corrigé depuis le temps que ça existe. Les nouvelles entrées de la session courante sont ajoutées à la fin de fichier .bashrc, sans modification des anciennes entrées. Ces variables ne servent donc qu'à alléger l'historique de la session courante, mais ne le font pas définitivement.
Tu peux utiliser le code que j'ai proposé si tu veux que ce soit fait définitivement.
Hors ligne
#12 Le 26/04/2018, à 12:23
- maxire
Re : Code pour alléger l'historique du terminal
SI, je pense que c'est un bug.
Parfois les bugs peuvent survivre des années si personne ne met la pression, je crois que peu de gens tentent réellement de configurer l'historique de bash
Je viens de trouver cette discussion déjà ancienne qui constate le fonctionnement bizarre de erasedups par exemple.
J'avoue ne pas avoir bien compris la mise en œuvre des solutions proposées.
Bon je ne vais pas m'embêter plus que cela avec ce problème, ce fil m'avait donné l'idée d'optimiser l'historique, je vais tenter ta solution.
Maxire
Archlinux/Mate + Ubuntu 22.04 + Archlinux/Gnome sur poste de travail
Hors ligne
#13 Le 26/04/2018, à 14:49
- MicP
Re : Code pour alléger l'historique du terminal
Bonjour
- Le fichier ~/.bash_history est lu à chaque ouverture de session bash
- Mais les lignes de commande(s) exécutées dans chaque session, ne sont traitées par les directives (ignoredups: etc.)
et enregistrées qu'en mémoire dans un tampon associé à chaque session bash ouverte
et ce n'est seulement qu'à la fermeture de la session que les lignes de commandes qui avaient été entrées (et qui ont été enregistrées en mémoire)
seront ajoutées dans le fichier ~/.bash_history
=======
Pour que le fichier ~/.bash_history soit mis à jour après l'exécution de chaque commande (quand le prompt réapparaît),
tu pourrais ajouter la ligne de commande suivante dans ton fichier ~/.bashrc
PROMPT_COMMAND="history -a; ~/.config/historyScript.sh; history -c; history -r; $PROMPT_COMMAND" # À chaque fois que le prompt est affiché : -a append; exécute ~/.config/historyScript.sh; -c clear; -r read
De cette façon, tu pourra faire traiter ton fichier ~/.bash_history par ~/.config/historyScript.sh
et il sera pris en compte à chaque nouvel affichage du prompt dans chaque session bash ouverte.
De plus, les commandes qui auront été exécutées dans une fenêtre de terminal
seront aussi accessibles dans l'history (en mémoire) des autres fenêtres de terminal dès l'affichage d'un nouveau prompt.
Dernière modification par MicP (Le 26/04/2018, à 15:14)
Hors ligne
#14 Le 26/04/2018, à 16:12
- maxire
Re : Code pour alléger l'historique du terminal
Salut Micp,
et ce n'est seulement qu'à la fermeture de la session que les lignes de commandes qui avaient été entrées (et qui ont été enregistrées en mémoire)
seront ajoutées dans le fichier ~/.bash_history
C'est justement ce fonctionnement qui semble incorrect avec erasedups.
Ce n'est pas le tampon purgé des lignes dupliquées qui est sauvegardé dans .bash_history mais la version non purgée,
J'ai trouvé cette solution:
[aspire7730z@asus-arch ~]$ cat /etc/bash.bash_logout
#
# /etc/bash.bash_logout
#
history -w
history -c
[aspire7730z@asus-arch ~]$
Donc écrire le tampon dans le fichier .bash_history puis l'effacer pour éviter la mise à jour de l'historique buggée lors de la fermeture du shell.
Enfin c'est comme cela que j'ai compris la chose.
Cela fonctionne en mode console VT mais pas avec le terminal graphique.
En mode graphique, avec mate-terminal j'ai été obligé de forcer la clef login-shell du schema glib2 org.mate.terminal.profile à vrai pour forcer l'ouverture du terminal en mode login shell.
Dernière modification par maxire (Le 26/04/2018, à 16:28)
Maxire
Archlinux/Mate + Ubuntu 22.04 + Archlinux/Gnome sur poste de travail
Hors ligne
#15 Le 26/04/2018, à 16:23
- maxire
Re : Code pour alléger l'historique du terminal
Et que mettre dans ~/.config/historyScript.sh?
Je crois que je n'ai pas tout compris de ta solution Micp.
Maxire
Archlinux/Mate + Ubuntu 22.04 + Archlinux/Gnome sur poste de travail
Hors ligne
#16 Le 26/04/2018, à 16:47
- MicP
Re : Code pour alléger l'historique du terminal
…Et que mettre dans ~/.config/historyScript.sh?…
Au départ, rien du tout, il faudrait juste voir ce que les directives de la commande history provoquent dans le fichier ~/.bash_history
de façon à déterminer ce qu'il faudrait mettre dans le script afin d'obtenir ce que l'utilisateur voudrait.
=======
D'autre part, s'il est question de traiter les lignes de commandes en fonction de leur date/heure,
il est aussi possible de renseigner la variable HISTTIMEFORMAT
avec par exemple :
HISTTIMEFORMAT="%s"
ce qui permettrait de faire précéder chaque ligne de commande enregistrée dans le fichier ~/.bash_history (par la commande history)
par la date/heure à laquelle cette commande a été lancée,
ce qui, dans le fichier ~/.bash_history donnera :
#1524757116
ls
#1524757119
date
#1524757122
df
#1524757124
du
#1524757127
exit
michel@debvirt:~$ date -d@1524757127
jeudi 26 avril 2018, 17:38:47 (UTC+0200)
michel@debvirt:~$
On obtiendrait une liste des commandes entrées avec la date/heure à laquelle elles on été entrées.
=======
En fait, il serait d'abord question de voir ce qu'il est possible de faire faire à la commande history
en fonction de ce qu'elle sait déjà faire,
pour ensuite ajouter les fonctions de traitement à faire faire par le script à créer,
en fonction du but recherché.
=======
Toujours est-il que tant qu'une partie des commandes étaient dans le tampon mémoire de chaque fenêtre de terminal ouverte,
il était impossible de pouvoir traiter ces fichiers historique de façon globale.
Mais en utilisant la méthode de mise à jour du fichier ~/.bash_history que je proposais,
il est possible d'utiliser un script qui va classer les commandes entrées de façon globale.
=======
…Je souhaiterais également savoir s'il y avait une commande qui permettait de ne pas conserver dans l'historique la dernière commande saisie.…
Il suffit de mettre un caractère espace au tout début de la ligne de commande pour qu'elle ne soit pas enregistrée dans l'history
C'est la fonction de la directive ignorespace (de la commande history) qui est activée par défaut
=======
sudo shred -fuvzn15 fichierA sudo shred -fuvzn15 fichierB sudo shred -fuvzn15 fichierC
Ces 3 entrées vont rester dans l'historique du terminal, or je souhaiterais améliorer mon code pour qu'il supprime ces 3 entrées et qu'il ne me conserve que la dernière entrée.
Avez-vous des suggestions ?
Si tu veux lancer la dernière ligne de commande qui a été enregistrée par history
dont les premiers mots sont sudo shred -fuvzn15
il te suffit d'entrer la ligne de commande suivante :
!sudo shred -fuvzn15
Une fois cette ligne de commande entrée,
la commande
sudo shred -fuvzn15 fichierC
sera directement lancée.
Mais tu pourrais préférer d'abord visualiser la ligne trouvée
afin d'éventuellement la modifier avant de la lancer,
il suffit d'activer les options bash
histappend et histverify
avec la ligne de commande suivante :
shopt -s histappend histverify
Une fois ces options activées,
quand tu lancera la commande
!sudo shred -fuvzn15
cette ligne de commande sera remplacée par ce qui a été trouvé :
sudo shred -fuvzn15 fichierC
et tu pourra, si besoin, modifier cette ligne de commande avant de décider de la lancer.
Dernière modification par MicP (Le 26/04/2018, à 17:35)
Hors ligne
#17 Le 06/05/2018, à 00:43
- sabayke
Re : Code pour alléger l'historique du terminal
Salut la famille suis nouveau sur Ubuntu j'ai installé ubuntu 16.04 LTS
je voulais savoir comment on fait pour savoir les commandes qui commencent par 5 caractères dans le répertoire /bin
MERCI D'AVANCE
Hors ligne
#18 Le 06/05/2018, à 07:03
- Compte supprimé
Re : Code pour alléger l'historique du terminal
Bonjour,
@sabayke: Bienvenu sur le forum. Le mieux est d'ouvrir un nouveau sujet pour ta question ...
#19 Le 06/05/2018, à 09:26
- Ayral
Re : Code pour alléger l'historique du terminal
Modération : en effet il faut que tu crées ta propre discussion dans la même section en utilisant le lien Nouvelle discussion en haut de la section Terminal, scripts et ligne de commande
Merci
Pour mettre les retours de commande entre deux balises code, les explications sont là : https://forum.ubuntu-fr.org/viewtopic.php?id=1614731
Blog d'un retraité
Site de graphisme du fiston Loïc
Ubuntu 22.04 LTS sur un Thinkpad W540
Hors ligne