Gestion de l'historique Bash avec plusieurs terminaux

110

J'utilise principalement Terminator, et il est généralement ouvert avec 3 fenêtres de terminal divisées. J'utilise aussi le terminal Gnome pour diverses raisons.
Je me demande comment l’histoire de bash est gérée dans ce cas car je manque parfois des commandes précédemment émises lorsque je lancehistory

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

Lançant également Gnome Terminal après l’utilisation de Terminator, j’obtiens la ligne 100 au démarrage, quelles que soient les commandes passées auparavant dans Terminator

Zetah
la source

Réponses:

107

La session bash enregistrée est celle du terminal qui est fermé le plus tard. Si vous souhaitez enregistrer les commandes pour chaque session, vous pouvez utiliser l'astuce expliquée ici .

export PROMPT_COMMAND='history -a'

Pour citer la page de manuel: «Si cette option est définie, la valeur est exécutée sous forme de commande avant l'émission de chaque invite principale.»

Ainsi, chaque fois que ma commande est terminée, l'élément historique non écrit est ajouté ~/.bash_historyavant d'afficher à nouveau l'invite (uniquement $ PS1).

Donc, après avoir mis cette ligne, /etc/bash.bashrcje n'ai pas à me retrouver à réinventer des roues ou à perdre de précieuses secondes à taper à nouveau du texte simplement parce que j'étais paresseux avec mes terminaux.

Quoi qu'il en soit, vous devrez tenir compte du fait que les commandes de différentes sessions seront mélangées dans votre fichier d'historique afin qu'il ne soit pas si simple de le lire ultérieurement.

Voir également:

jcollado
la source
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 d'historique étranges dans le terminal.
Zetah
@VineetMenon Pour plus de détails, regardez ici . Parties intéressantes: Lorsque le shell démarre, l'historique est initialisé à partir du fichier nommé par la variable HISTFILE (par défaut `~ / .bash_history '). [...] Lorsqu'un shell interactif se termine, les dernières lignes $ HISTSIZE sont copiées de la liste de l'historique dans le fichier nommé par $ HISTFILE.
jcollado
32

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

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$(date +%y%b%d-%H%M%S).$$
# 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 le du -sk .historynettoyer. C'est bien d'avoir toutes les commandes que j'ai tapées conservées pour moi.

J'ai juste utilisé ce qui précède pour voir ce que j'avais fait récemment:
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 1er argument, par exemple sudo mountdans la chaîne de tri).

Waltinator
la source
3
Pourquoi attribuez-vous HISTFILESIZEdeux fois?
Daniel
2
En réglant HISTFILESIZE sur 0, j'efface le tampon de l'historique et réinitialise le mécanisme de sauvegarde de l'historique. Ensuite, je définis la taille que je veux vraiment et commence à enregistrer l'historique dans HISTFILE. Voir la section HISTORIQUE de man bash.
Waltinator
1
existe-t-il un moyen de fusionner les fichiers d’historique afin de rétablir le Ctrl+rtravail?
n611x007
3
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') à la place et j'utilise Ctrl-r pour rechercher l'historique d'une session individuelle. Lisez à man bash-builtinspropos de la commande history. Mon sort .history/* | uniq -c | sort -n | wc -lmontre 16033 commandes uniques, cut '-d ' -f1 .history/* | sort | uniq -c | sort -nmontre 2004 commandes uniques, principalement des fautes de frappe. Charger tout cela dans la "liste d'historique" de bash ne serait d'aucune aide.
Waltinator
@waltinator - Je sais que c'est un vieux commentaire, mais insinuez-vous que le fait de définir une variable d'environnement déclenche en quelque sorte une action immédiate? Quel processus va prendre en compte le fait que vous avez attribué la valeur 0 à HISTFILESIZE dans un shell local et que vous passiez immédiatement à 4096? est-ce quelque chose de non documenté dans le traitement de certains noms de variables par bash?
Non synchronisé le
8

Pour montrer historyde tous les terminaux:

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

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


Elijah Lynn
la source
3
Je dirai qu'après quelques mois d'utilisation de ce logiciel, j'ai finalement commenté cela récemment. C’est doux-amer, car je ne veux pas toujours passer au crible les 100 dernières commandes, mais pour exécuter celle que j’avais exécutée à l’origine dans le volet Tmux, j’ai parfois une commande de journal dédiée dans laquelle je dois redémarrer.
Elijah Lynn
Une belle solution que propose la coquille de poisson est un history --merge. Je l'utilise depuis environ un an maintenant et cela résout le problème. Lorsque je souhaite connaître l'historique le plus récent des autres sessions, il suffit d'exécuter cette commande, qui est disponible instantanément.
Elijah Lynn
l'exportation n'est pas nécessaire.
Expiation limitée le
6

Voir aussi " conserver l'historique persistant dans bash " pour une autre alternative. Il invite votre invite à envoyer toutes les commandes jamais saisies dans n’importe quel terminal dans un fichier "historique persistant" (à côté de ce qui est habituellement fait pour la base .history).

Eli Bendersky
la source
1
J'ai inséré $$ pour créer la ligne. echo $$ $date_part "$command_part" >> ~/.persistent_historyCeci préfixe les entrées avec les PID de leur processus bash, afin que nous puissions démêler plusieurs historiques.
Evgeni Sergeev
L'historique alternatif peut-il être associé à la recherche d'historique CTRL-R?
max