l'histoire n'est pas préservée dans zsh

16

Chaque fois que j'ouvre une nouvelle instance d'un terminal, l'historique est vide. Pourquoi donc? Dois-je configurer quelque chose? En bash, cela n'est pas nécessaire.

Gilles 'SO- arrête d'être méchant'
la source
Pas sûr zsh, mais bashécrit par défaut dans ses fichiers d'historique à la sortie , ce qui signifie que si vous ne l'avez pas utilisé auparavant et ouvrez certains shells, ils afficheront tous maintenant l'historique jusqu'à ce qu'au moins un se déconnecte, écrivant ainsi son fichier d'historique.
DopeGhoti

Réponses:

24

Bash et zsh ont des valeurs par défaut différentes. Zsh n'enregistre pas l'historique dans un fichier par défaut.

Lorsque vous exécutez zsh sans fichier de configuration, il affiche une interface de configuration. Dans cette interface de configuration, sélectionnez

(1)  Configure settings for history, i.e. command lines remembered
     and saved by the shell.  (Recommended.)

puis passez en revue les paramètres proposés et sélectionnez

# (0)  Remember edits and return to main menu (does not save file yet)

Répétez l'opération pour les autres sous-menus pour (2) l'achèvement, (3) les raccourcis clavier et (4) les options, puis sélectionnez

(0)  Exit, saving the new settings.  They will take effect immediately.

dans le menu principal.

Les paramètres liés à l'historique recommandés sont

HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000
setopt appendhistory

J'utiliserais un nom différent pour le fichier historique, pour indiquer qu'il s'agit du fichier historique de zsh. Et 1000 lignes peuvent être augmentées sur un système moderne.

HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
setopt appendhistory

Soit dit en ~/.zshrcpassant, ces lignes entrent .

Gilles 'SO- arrête d'être méchant'
la source
8

Bien que la réponse actuelle soit correcte, j'ai pensé qu'il valait la peine d'ajouter qu'il existe peut-être une meilleure option que appendhistoryde sauvegarder votre historique, et c'est le cas SHARE_HISTORY.

À partir de la documentation, SHARE_HISTORY"importe à la fois de nouvelles commandes à partir du fichier historique et entraîne également l'ajout de vos commandes tapées au fichier historique". Cela signifie que les obus sont également conscients de l'histoire de l'autre sans avoir à fermer l'actuelle ou à en ouvrir une nouvelle.

Donc, tous ensemble, vous le définissez comme ceci:

HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=1000
setopt SHARE_HISTORY
Bert
la source
1
+1 et bienvenue dans U / L, mais personnellement je préfère INC_APPEND_HISTORY_TIME, qui écrit dans l'historique de tous les terminaux comme ci-dessus, mais cet historique "ne sera pas disponible immédiatement à partir d'autres instances du shell qui utilisent le même fichier d'historique". Cela a plus de sens pour moi, car je peux alors parcourir l'historique de chaque terminal indépendamment, mais tout est toujours connecté.
Sparhawk
2
Merci! Oui, c'est assez juste et je peux totalement comprendre pourquoi cela INC_APPEND_HISTORY_TIMEpourrait être plus logique. Je n'aurais probablement pas dû dire "mieux", je suppose que c'est juste une question de préférence personnelle à ce stade!
bert
0

lorsque vous passez de bash à zsh pour la première fois, votre historique bash ne sera pas transféré. Donc, tout l'historique que vous aviez dans bash est toujours dans le fichier historique de bash. zsh commence à capturer l'historique à partir du moment où vous commencez à l'utiliser comme shell.

Si vous ne l'avez pas configuré pour capturer l'historique, vous pouvez réexécuter l'assistant de configuration et indiquer à zsh la quantité d'historique à enregistrer. Modifiez le nom de ~ / .zshrc ou supprimez-le pour obtenir une nouvelle photo de l'assistant.

LocoCoyote
la source
0

Si cela ne fonctionne pas et que tout cela est déjà en place, essayez:

fc -W

Cela écrit l'historique actuel dans le fichier historique. Et si vous obtenez:

zsh: locking failed for /home/username/.zsh_history: permission denied

il est alors temps de vérifier les autorisations sur le fichier et sur le répertoire parent.

Chris Snyder
la source