Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/04/2018, à 13: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, à 13: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, à 14: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, à 14:04)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#4 Le 04/04/2018, à 14: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, à 15:02

yoles

Re : Code pour alléger l'historique du terminal

pingouinux a écrit :

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.

Watael a écrit :

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, à 15:11)

Hors ligne

#6 Le 04/04/2018, à 15:09

yoles

Re : Code pour alléger l'historique du terminal

credenhill a écrit :

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, à 15:50)

Hors ligne

#7 Le 05/04/2018, à 21: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, à 21:11)

Hors ligne

#8 Le 05/04/2018, à 21: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, à 22: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, à 11: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:

info bash a écrit :

'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, à 13: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, à 13: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, à 15: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, à 16:14)

Hors ligne

#14 Le 26/04/2018, à 17:12

maxire

Re : Code pour alléger l'historique du terminal

Salut Micp,

Micp a écrit :

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, à 17:28)


Maxire
Archlinux/Mate + Ubuntu 22.04 + Archlinux/Gnome sur poste de travail

Hors ligne

#15 Le 26/04/2018, à 17: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, à 17: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, à 18:35)

Hors ligne

#17 Le 06/05/2018, à 01: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, à 08: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 ... wink

#19 Le 06/05/2018, à 10: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