136 votes

Traitement de l'historique de Bash avec des terminaux multiples

J'utilise principalement Terminator, et il est généralement ouvert avec 3 fenêtres de terminal divisé. J'utilise également le terminal Gnome pour diverses raisons.
Je me demande comment est géré l'historique de bash dans ce cas, car il m'arrive de rater des commandes précédemment émises lorsque j'exécute history

Par exemple, mon invite montre la ligne d'historique actuelle de bash ( \! ) 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. Quel historique sera sauvegardé ?

De même, en lançant le terminal Gnome après avoir utilisé Terminator, j'obtiens la ligne 100 au démarrage, indépendamment de toutes les commandes émises auparavant dans Terminator.

134voto

colinfang Points 1297

La session bash qui est sauvegardée est celle du terminal qui est fermée le plus tard. Si vous voulez sauvegarder les commandes pour chaque session, vous pouvez utiliser l'astuce suivante ici .

export PROMPT_COMMAND='history -a'

Pour citer la page de manuel : "Si elle est définie, la valeur est exécutée comme une commande avant l'émission de chaque invite primaire."

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

Donc après avoir mis cette ligne dans /etc/bash.bashrc Je n'ai pas besoin de réinventer la roue ou de perdre de précieuses secondes à retaper des documents simplement parce que j'ai été 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 et qu'il ne sera pas si simple de le lire plus tard.

Voir aussi :

38voto

waltinator Points 32821

Après de multiples 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 a 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 du -sk .history et le nettoyer. C'est agréable 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'ai fait 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
(afin d'inclure le 1er argument, par ex. sudo mount dans la chaîne de tri).

10voto

Eli Bendersky Points 209

Voir aussi " conserver l'historique persistant dans bash "pour une autre alternative. Elle fait en sorte que votre invite envoie toutes les commandes jamais tapées à cualquier dans un fichier d'"historique persistant" (parallèlement à ce qui est généralement fait pour l'historique régulier). .history ).

9voto

Elijah Lynn Points 3577

Pour montrer history de tous les terminaux :

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

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


6voto

BruceJo Points 169

L'historique de toutes les sessions Shell est moins utile que je l'espérais !

J'ai mis avec enthousiasme PROMPT_COMMAND='history -a; history -r' dans l'espoir que mon utilisation de l'histoire soit bien meilleure !

Wow, j'ai été déçu.

Essentiellement, faire cela rend la flèche up/dn inutile. Parce que maintenant, chaque session d'historique est remplie de commandes provenant d'autres sessions. Et pour moi, cela fait perdre la meilleure fonctionnalité de l'historique.

Ce que je voulais vraiment

De temps en temps, je voulais essentiellement transférer mon historique d'une session de terminal à une autre session afin de pouvoir facilement rappeler les commandes de cette session. Et je peux le faire de manière très sélective.

Ce que j'ai fait

J'ai mis en place une série d'alias simples de manipulation de l'historique & j'ignore ces commandes dans l'historique :

alias ha="history -a"
alias hb="history -a; history -r"
alias hr="history -r"
alias hl="history | tail -20"
HISTIGNORE="ha:hb:hr:hl"

Je pense à hb comme mélange d'histoire... les autres sont explicites.

Maintenant, lorsque je veux copier mon historique de la session A à la session B, je peux le faire :

  • A : ha - session annexe A historique vers le fichier historique
  • B : hb - session annexe B historique au fichier historique et ensuite lire le fichier

Cela préserve essentiellement l'ordre de l'historique pour la session B et ajoute la session A l'histoire plus loin dans la liste.

Super utile pour moi. Peut-être vous aidera-t-il aussi !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X