Question Gestion de l'historique des bash avec plusieurs terminaux


J'utilise principalement Terminator, et il est généralement ouvert avec 3 fenêtres de terminal séparées. J'utilise également le terminal Gnome pour diverses raisons.
Je me demande comment l'historique de bash est géré dans ce cas, car je manque parfois des commandes déjà émises lorsque je cours history

Par exemple, mon invite affiche la ligne d'historique bash actuelle (\!) et si je lance Terminator avec 3 fenêtres de terminal divisées, j'obtiens la même ligne d’historique (disons 100) sur tous les terminaux. Quelle histoire sera sauvée?

En lançant également Gnome Terminal après avoir utilisé Terminator, je reçois la ligne 100 au démarrage, quelles que soient les commandes émises auparavant dans Terminator


89
2017-11-18 06:39


origine




Réponses:


La session bash enregistrée est celle de la fermeture du terminal. Si vous voulez enregistrer les commandes pour chaque session, vous pouvez utiliser le tour expliqué ici.

export PROMPT_COMMAND='history -a'

Pour citer la page de manuel: "Si elle est définie, la valeur est exécutée en tant que commande avant l'émission de chaque invite principale."

Ainsi, chaque fois que ma commande est terminée, elle ajoute l’élément d’historique non écrit à ~/.bash_history avant d'afficher l'invite (seulement $ PS1) à nouveau.

Donc, après avoir mis cette ligne dans /etc/bash.bashrc Je n'ai pas à me réinventer des roues ou à perdre de précieuses secondes à retaper des choses simplement parce que je suis paresseux avec mes terminaux.

Quoi qu'il en soit, vous devrez prendre en compte le fait que les commandes provenant de différentes sessions seront mélangées dans votre fichier d'historique. Il ne sera donc pas si simple de le lire plus tard.

Voir également:


82
2017-11-18 06:52



n'est-il pas stocké séparément pour différents TTL? - Vineet Menon
Excellent. Merci pour l'explication et la solution. J'ai essayé avec export PROMPT_COMMAND='history -a; history -r' et j'ai eu quelques numéros de ligne étranges dans le terminal - après avoir émis des sauts de numéros de ligne d’historique des commandes en 2000 à la place de 1, ce qui est étrange mais se comporte comme cela - l’historique de tous les terminaux est sauvegardé. - zetah
@VineetMenon Pour plus de détails, regardez ici. Parties intéressantes: Au démarrage du shell, l'historique est initialisé à partir du fichier nommé par la variable HISTFILE (par défaut: ~ / .bash_history). [...] Lorsqu'un shell interactif se ferme, les dernières lignes $ HISTSIZE sont copiées de la liste d'historique dans le fichier nommé par $ HISTFILE. - jcollado
Ce site semble en panne: northernmost.org/blog/flush-bash_history-after-each-command - Shubham


Après plusieurs lectures de man bash, J'utilise des fichiers d'historique séparés pour chaque shell. j'ai fait un mkdir -m 0700 ~/.history puis ajouté

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$$
# close any old history file by zeroing HISTFILESIZE  
HISTFILESIZE=0  
# then set HISTFILESIZE to a large value
HISTFILESIZE=4096  
HISTSIZE=4096  

à mon ~/.bashrc. De temps en temps, je me souviens de du -sk .history et le nettoyer. C'est bien d'avoir toutes les commandes que j'ai tapées pour moi.

Je viens d'utiliser ce qui précède pour voir ce que je faisais, dernièrement:
cut -f1 "-d " .history/* | sort | uniq -c |sort -n -r |less
ou
cut -f1-2 "-d " .history/* | sort | uniq -c |sort -n -r |less
(pour inclure le premier argument, par ex. sudo mount dans la chaîne de tri).


27
2017-11-19 23:48



Pourquoi attribuez-vous HISTFILESIZE deux fois? - Daniel
En définissant HISTFILESIZE sur 0, j'efface le tampon d'historique et réinitialise le mécanisme de sauvegarde d'historique. Ensuite, je règle la taille que je veux vraiment et commence à enregistrer l’historique dans HISTFILE. Voir la section HISTORIQUE de man bash. - waltinator
existe-t-il un moyen de fusionner les fichiers d’historique pour Ctrl+r travaille encore? - n611x007
Cela devrait être une nouvelle question, mais je ne pense pas que ce soit une bonne idée. j'utilise egrep 'whatever' .history/* (ou cat .history/* | egrep 'whatever') et utilisez Ctrl-r pour rechercher l’historique de chaque session. Lis man bash-builtins à propos de la commande d'historique. ma sort .history/* | uniq -c | sort -n | wc -l montre 16033 commandes uniques, cut '-d ' -f1 .history/* | sort | uniq -c | sort -n montre les commandes uniques de 2004, principalement des fautes de frappe. Charger tout cela dans la "liste d'historique" de bash ne serait pas utile. - waltinator


Voir également "garder l'histoire persistante dans bash"pour une autre alternative. Il installe votre invite pour envoyer toutes les commandes saisies dans tout terminal dans un fichier "historique persistant" (à côté de ce qui se fait habituellement pour les .history).


4
2018-01-24 23:33



J'ai inséré $$ faire la ligne echo $$ $date_part "$command_part" >> ~/.persistent_history Cela préfixe les entrées avec les PID de leur processus bash, afin de pouvoir démêler plusieurs historiques. - Evgeni Sergeev


Montrer history de tous les terminaux:

Ajouter export PROMPT_COMMAND='history -a; history -r' à votre fichier .bashrc.

La source: http://northernmost.org/blog/flush-bash_history-after-each-command



4
2017-10-31 19:17



Je dirai qu'après quelques mois d'utilisation, j'ai finalement commenté cela récemment. Il est doux-amer, car je ne veux pas toujours passer en revue les 100 dernières commandes uniquement pour exécuter celle que j'avais initialement exécutée dans la sous-fenêtre Tmux. - Elijah Lynn
Une bonne solution que propose la coquille de poisson est une history --merge. Je l'utilise depuis un an environ et cela résout le problème. Lorsque je veux connaître l'historique le plus récent des autres sessions, je lance simplement cette commande et celle-ci est disponible instantanément. - Elijah Lynn