Histoire rongée

15

En mode gui, lorsqu'un utilisateur a plus d'un terminal ouvert, comment les terminaux réécrivent-ils le fichier historique de cet utilisateur? la raison pour laquelle je demande est parce que, il est tout à fait possible que dans chacun des terminaux, l'utilisateur finisse par exécuter des commandes différentes. Alors, le fichier historique finit-il par sauvegarder les commandes de tous les terminaux ou seulement du premier à ouvrir? Ou existe-t-il un autre type de système qui est utilisé pour faire face à cette situation?

Geai
la source

Réponses:

11

Cela dépend entièrement de la façon dont le shell choisit de le gérer

bashpar défaut, le fichier d'historique sera écrasé par l'historique local de chaque shell à sa sortie, donc le dernier shell à quitter l'emportera. L' histappendoption le fera s'ajouter à l'historique maître à la place ( shopt -s histappend).

zsh fait de même par défaut, et a quelques options pour y faire face:

  • appendhistory - L'historique de chaque shell est ajouté au fichier historique principal à la sortie du shell
  • incappendhistory - Le fichier d'historique principal est mis à jour chaque fois qu'une ligne est exécutée dans un shell, au lieu d'attendre que ce shell se termine
  • sharehistory- Comme incappendhistory, mais extrait également les modifications du fichier d'historique principal dans tous les shells en cours d'exécution, vous pouvez donc exécuter une commande dans un shell, puis frapper Updans un autre shell et la voir
Michael Mrozek
la source
Maintenant, dites-moi comment faire cela dans Bash s'il vous plaît;)
tante
1
@tante shopt -s histappendne fonctionne pas?
Michael Mrozek
0

J'ai d'abord eu cette idée dans le livre O'Reilly "Unix Power Tools".

Dans mon .profileje mets:

export HISTFILE=$HOME/.sh_hist.$$

Chaque fois que mon .profileest lu, je reçois un nouveau fichier historique nommé avec le PID de ma session. Si j'ai plusieurs connexions, chaque connexion obtient un fichier historique unique. Fonctionne dans kshetbash .

Si vous ouvrez simplement de nouveaux terminaux dans une session X, ceux-ci ne sont généralement pas des shells de connexion, mais vous pouvez les configurer pour qu'ils agissent comme des shells de connexion. Par exemple, rxvt +lsva commencerrxvt comme un shell de connexion. Vérifiez les documents pour le terminal que vous utilisez.

De plus, à moins que vous n'utilisiez un fichier .logoutou .bash_logout(ou tout autre moyen) pour nettoyer, vous finirez par avoir un crapload de .sh_histfichiers.

mazianni
la source
0

tcsh: set savehist = (5000 merge)fusionne

user39122
la source