L'historique de Bash n'est pas conservé entre les sessions de terminal sur Mac

33

Mon histoire bash a mystérieusement cessé de fonctionner, et je n'ai aucune idée de comment y remédier. Voici à quoi ressemble mon .bashrc:

HISTSIZE=500
HISTFILESIZE=500
HISTFILE=$HOME/.bash_history

Cependant, lorsque je l'exécute, echo $HISTFILEil s'imprime /Users/myusername/.bash_sessions/EE8689E5-7DAD-4018-817E-0AF1DE36082A.historynew.

Je suis le propriétaire du fichier .bash_history, donc je ne suis pas trop sûr de la façon dont je voudrais résoudre ce problème.

Merci!


la source
Salut Nelson, bienvenue sur Super User. Vérification rapide de ces espaces insérés par vous?
bertieb
oui, je les enlèverai et je ferai rapport.
@bertieb, j'ai supprimé les espaces et maintenant $ HISTFILESIZE est correctement répercuté. Cependant, l'historique reste non enregistré et $ HISTFILE affiche ce fichier d'historique temporaire impair (qui, je suppose, stocke l'historique uniquement pour cette session).
Essayez-vous de changer $HISTFILE, par intérêt? Je n'ai pas d' .bashrcOSX et echo $HISTFILEsignale l'endroit auquel je m'attendrais - commenter les lignes en question a-t-il un effet?
bertieb
1
Indiquez toujours des extensions variables de chemin: HISTFILE="$HOME/.bash_history”. Sans les guillemets, votre version ne sera pas valide si le chemin d'accès à votre répertoire personnel contient des espaces (ou éventuellement d'autres caractères spéciaux).
Chris Page

Réponses:

26

Le terminal attribue à chaque session de terminal un identifiant unique et le communique via la variable d'environnement TERM_SESSION_ID afin que les programmes s'exécutant dans un terminal puissent enregistrer / restaurer l'état spécifique à l'application lors de la fermeture et du redémarrage du terminal avec la reprise activée.

Un nouveau dossier (~ / .bash_sessions /) est utilisé pour stocker les fichiers HISTFILE et .session qui sont uniques aux sessions.

Au démarrage du shell, le fichier de session est exécuté. Les anciens fichiers sont supprimés périodiquement.

Le comportement par défaut organise l'enregistrement et la restauration de l'historique des commandes bash indépendamment pour chaque session de terminal restaurée. Il fusionne également les commandes dans l'historique global des nouvelles sessions.

Vous pouvez désactiver ce comportement et partager un seul historique en définissant

export SHELL_SESSION_HISTORY=0

Si HISTTIMEFORMAT est défini, l'historique par session est désactivé par défaut (en savoir plus dans / private / etc / bashrc_Apple_Terminal)

Le mécanisme de sauvegarde / restauration est désactivé si le fichier suivant existe:

~/.bash_sessions_disable

Apple a déjà modifié certains comportements depuis la sortie d'El Capitan, il est donc préférable d'aller en savoir plus ici less /private/etc/bashrc_Apple_Terminal

diimdeep
la source
3
Mais ne commencez pas simplement par désactiver le mécanisme de sauvegarde / restauration. Si vous rencontrez des problèmes avec l'historique des commandes shell, essayez de résoudre ce problème. Le ~/.bash_sessions_disablefichier est conçu en dernier recours en cas de problème qui ne peut pas être résolu spécifiquement. Il désactive plus que les historiques de commandes par session et vous pouvez désactiver uniquement l'historique des commandes par session. Voir les commentaires dans /etc/bashrc_Apple_Terminalpour plus de détails.
Chris Page
1
@ChrisPage En fait, Apple a changé quelques morceaux de script. Réponse mise à jour, merci.
diimdeep
@diimdeep Où ajouter cette ligne? export SHELL_SESSION_HISTORY=0
zerohedge
@zerohedge .bashrcet .bash_profile unix.stackexchange.com/a/310150/15362
diimdeep
@diimdeep Merci. Cela semble fonctionner en ce moment. At-il des ramifications?
zerohedge
6

J'ai remarqué quelque chose de similaire après la mise à niveau d'El Capitan. Le simple fait d'ajouter le fichier .bash_sessions_disabledans votre répertoire personnel désactive les nouvelles sessions bash et .bash_historyest de nouveau utilisé.

Ce fil Reddit a plus d'informations et d'autres liens.

rabs
la source
Mais ne commencez pas simplement par désactiver le mécanisme de sauvegarde / restauration. Si vous rencontrez des problèmes avec l'historique des commandes shell, essayez de résoudre ce problème. Le ~/.bash_sessions_disablefichier est conçu en dernier recours en cas de problème qui ne peut pas être résolu spécifiquement. Il désactive plus que les historiques de commandes par session et vous pouvez désactiver uniquement l'historique des commandes par session. Voir les commentaires dans /etc/bashrc_Apple_Terminalpour plus de détails.
Chris Page
Merci Chris - quoi d'autre cela désactive-t-il mon historique a fonctionné comme prévu (identique à la version osx précédente et identique à linux) au cours des deux derniers mois. Je ne sais pas pourquoi ils l'ont changé?
rabs
@rabs je suggère d'ajouter SHELL_SESSION_HISTORY=0en haut de ~/.bash_profile.
Teejay
5

Vous pouvez résoudre le problème RVM en mettant à jour la dernière version RVM ou en exécutant ceci:

  echo 'shell_session_update' > $HOME/.bash_logout

Voir https://github.com/rvm/rvm/issues/3540 pour plus d'informations.

Alex Rojo
la source
1
Belle solution, sans avoir à modifier rvm.
mlo55
1
Parlons -nous du Ruby enVironment Manager (RVM) rvm.io ?? Quand et pourquoi cela devrait-il s'impliquer?
MarkHu
3

Cette réponse du fil Reddit m'a sauvé:

C'est probablement RVM qui empêche le "hook" de sortie pour que bash_sessions s'exécute. Si vous commentez la ligne suivante dans votre .bash_profile, cela devrait fonctionner.

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
noio
la source
Cela a en effet aidé!
Karsten
1

Si c'est un Mac, je suppose que son shell de connexion par défaut est bashet qu'il fonctionne à la .profileplace de .bashrc. Donc, vous éditiez le mauvais fichier.

theoden
la source
J'ai édité .profile donc c'est la même chose que mon .bashrc, et l'historique ne s'affiche toujours pas.
@NelsonLiu Que se passe-t-il lorsque vous faites écho $HISTFILEdans différentes parties de profile? Peut-être que vous sourcez un autre script qui change la variable? J'ai vérifié les deux Terminalet iTerm, bash 3et les 4 deux ont leur valeur par défaut $HOME/.bash_history.
theoden
comment pourrais-je faire écho à $ HISTFILE dans différentes parties du profil?
@NelsonLiu, n'est-ce pas évident? votre objectif est de savoir quand cela $HISTFILEchange. Ainsi, il suffit d'en faire deux echo $HISTFILEentourer votre code. Ce que vous devez faire est de trouver le morceau de code où les $HISTFILEchangements se echo $HISTFILEproduisent en rapprochant les deux lignes de plus en plus l'une de l'autre jusqu'à ce que quelque chose se révèle. C'est tout.
theoden
1
J'ai donc fait ce que vous m'avez demandé et fait que .bash_profile est le même que le profil. J'ai décidé de echo $HISTFILEle faire sur chaque ligne, juste pour voir s'il y avait des différences. Cependant, il n'a fait qu'imprimer /Users/username/.bash_historyune myriade de fois. J'ai ensuite couru echo $HISTFILEdans le shell, et il est sorti /Users/nelsonliu/.bash_sessions/CD275A29-1DF1-4ED8-B8CE-F706B11B812F.historynew.
0

Je voyais ce problème sur High Sierra. D'une certaine manière, mon propre .bash_history était devenu la propriété de root et n'avait même pas les autorisations de lecture pour les autres utilisateurs (lorsque le contenu du répertoire personnel était affiché avec ls -al)

Il n'y avait aucune conséquence dans ce fichier .bash_history, j'ai donc fait un sudo rm .bash_history suivi d'une touche .bash_history pour en créer un nouveau.

Tout va bien maintenant

Julian Jordan
la source
Pour moi, ce n'était pas les permissions de fichier, c'était que je n'avais défini aucune des variables de contrôle HIST. Apparemment, un ou plusieurs d'entre eux doivent être définis. J'ai ajouté ceci à mon ~/.bash_profilefichier:export HISTTIMEFORMAT='%F %T '
MarkHu