Les fichiers d'historique peuvent-ils être unifiés dans bash?

35

J'exécute régulièrement plusieurs screensessions sur mes ordinateurs de bureau et serveurs Linux.

Un problème avec ceci est que lorsque je grepconsulte l'historique des commandes, je découvre que j'ai émis une commande dans une session différente et que je dois me détacher et le reconnecter pour obtenir cet élément d'historique.

Est-il possible de «forcer» les historiques mis à jour différemment à partir de plusieurs sessions pour qu'ils passent tous dans un historique central?

garenne
la source
J'ai rencontré un problème similaire dans lequel je ne pouvais pas afficher l'historique entre les sessions de terminal. Il s'avère que mon fichier ~ / .bash_history était la propriété de root et qu'il n'était pas accessible en écriture. Changer le propriétaire / groupe en mon utilisateur a résolu le problème: sudo chown <utilisateur>: <groupe> ~ / .bash_history
mateo

Réponses:

41

Il y a deux choses à faire:

  1. Insérez la commande shopt -s histappenddans votre .bashrc. Cela ajoutera au fichier d’historique au lieu de l’écraser.
  2. Également dans votre fichier .bashrc, l’insertion PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"et l’historique seront réécrits et relus à chaque fois que bash affiche l’invite.

EDIT: Merci à e-t172 pour le history -ntour

innaM
la source
6
Merci pour cela. Je l'ai amélioré en utilisant PROMPT_COMMAND = "$ PROMPT_COMMAND; history -a; history -n". De cette façon, les commandes émises dans d'autres sessions apparaissent immédiatement dans l'historique de la session en cours (vous devez d'abord appuyer sur Entrée pour mettre à jour l'historique).
Etienne Dechamps
8
Je n'avais pas PROMPT_COMMANDdéfini auparavant, j'ai donc dû utiliser PROMPT_COMMAND="history -a; history -n"pour éviter les erreurs.
William Jackson
1
veuillez consulter la réponse de superuser.com/a/734410/250287 pour connaître les commandes d'historique correctes -a, -c et -r.
MTD
Juste une alerte pour le nouveau venu: après avoir utilisé la réécriture de l’historique pendant un moment, j’ai réalisé que j’émettais souvent de mauvaises commandes; quand vous voyez dans la ligne précédente une commande, vous vous attendez à ce que la flèche haut la répète, et avec cette configuration, ce n'est plus toujours le cas.
Tiago
11

Veuillez ne pas utiliser history -a; history -n, cela ne fonctionne pas comme prévu et vous laissera de nombreuses commandes dupliquées et hors d' usage dans votre historique. Une solution qui fonctionne généralement comme prévu est la suivante:

# unified bash history
shopt -s histappend
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

Utiliser une nouvelle ligne au lieu d'un point-virgule est également un moyen simple de traiter le problème de point-virgule manquant / en double avec PROMPT_COMMAND.

Adam Crane
la source
histoire -a, -c, puis -r est correct ... ce devrait être la réponse acceptée
mtd
1
Le exportn'est pas nécessaire. Parce que les options interactives du shell doivent être définies à partir ~/.bashrcde chaque sous-shell, l'héritage n'est donc pas nécessaire.
dolmen
Y a-t-il une bonne raison de ne pas simplement utiliser à la PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"place?
Six
Cette commande nécessiterait de stocker la dernière valeur de sortie avant d'exécuter les commandes d'historique, car de nombreuses commandes d'invite reposent sur ou affichent cette dernière.
Adam Crane
-1

PROMPT_COMMAND n'est pas défini par défaut dans certaines distributions. Par exemple, il est défini dans Arch, mais pas dans Debian.

J'ai un bashrc dans ma Dropbox que j'utilise en distro hopping, et il comprend:

PROMPT_COMMAND="$( [ '$PROMPT_COMMAND' ] && echo $PROMPT_COMMAND; )history -a; history -n"
czayas
la source
Une solution terrible à un problème de programmation shell basique. La bonne façon:PROMPT_COMMAND="$PROMPT_COMMAND; history -a; history -n"
dolmen
Mieux:PROMPT_COMMAND="$PROMPT_COMMAND"$'\n''history -a; history -n'
dolmen