El historial de Bash no se conserva entre sesiones de terminal en Mac

33

Mi historia de bash misteriosamente dejó de funcionar, y no tengo idea de cómo solucionarlo. Así es como se ve mi .bashrc:

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

Sin embargo, cuando lo ejecuto echo $HISTFILEse imprime /Users/myusername/.bash_sessions/EE8689E5-7DAD-4018-817E-0AF1DE36082A.historynew.

Soy el propietario del archivo .bash_history, por lo que no estoy muy seguro de cómo solucionar este problema.

¡Gracias!


fuente
Hola Nelson, bienvenido a Super User. ¿Comprobación rápida de esos espacios insertados por usted?
bertieb
Sí, lo fueron, los eliminaré e informaré.
@bertieb, eliminé los espacios y ahora $ HISTFILESIZE se repite correctamente. Sin embargo, el historial permanece sin guardar y $ HISTFILE imprime ese extraño archivo de historial temporal (que supongo que almacena el historial solo para esa sesión).
¿Estás tratando de cambiar $HISTFILE, por interés? No tengo un .bashrcOSX e echo $HISTFILEinforma el lugar que esperaría: ¿tiene algún efecto comentar las líneas en cuestión?
bertieb
1
Siempre citar expansiones variables ruta: HISTFILE="$HOME/.bash_history”. Sin las comillas, su versión no será válida si la ruta a su directorio principal contiene espacios (u otros caracteres especiales).
Chris Page

Respuestas:

26

Terminal asigna a cada sesión de terminal un identificador único y lo comunica a través de la variable de entorno TERM_SESSION_ID para que los programas que se ejecutan en un terminal puedan guardar / restaurar el estado específico de la aplicación al salir y reiniciar Terminal con Reanudar habilitado.

Se utiliza una nueva carpeta (~ / .bash_sessions /) para almacenar los archivos HISTFILE y .session que son exclusivos de las sesiones.

Durante el inicio del shell, se ejecuta el archivo de sesión. Los archivos antiguos se eliminan periódicamente.

El comportamiento predeterminado se encarga de guardar y restaurar el historial de comandos bash de forma independiente para cada sesión de terminal restaurada. También combina comandos en la historia global para nuevas sesiones.

Puede deshabilitar este comportamiento y compartir un solo historial configurando

export SHELL_SESSION_HISTORY=0

Si se define HISTTIMEFORMAT, el historial por sesión está deshabilitado de forma predeterminada (lea más en / private / etc / bashrc_Apple_Terminal)

El mecanismo de guardar / restaurar está deshabilitado si existe el siguiente archivo:

~/.bash_sessions_disable

Apple ya cambió su comportamiento desde el lanzamiento de El Capitan, por lo que es mejor ir a leer más sobre esto aquí. less /private/etc/bashrc_Apple_Terminal

diimdeep
fuente
3
Pero no comience simplemente deshabilitando el mecanismo de guardar / restaurar. Si tiene problemas con el historial de comandos de shell, intente resolver ese problema. El ~/.bash_sessions_disablearchivo está pensado como último recurso en caso de que haya un problema que no pueda resolverse específicamente. Deshabilita más que solo el historial de comandos por sesión, y puede deshabilitar solo el historial de comandos por sesión. Vea los comentarios en /etc/bashrc_Apple_Terminalpara más detalles.
Chris Page
1
@ChrisPage En realidad, Apple cambió algunos fragmentos de script. Respuesta actualizada, gracias.
diimdeep
@diimdeep ¿Dónde agregaría esta línea? export SHELL_SESSION_HISTORY=0
zerohedge
@zerohedge .bashrcy .bash_profile unix.stackexchange.com/a/310150/15362
diimdeep
@diimdeep Gracias. Esto parece estar funcionando en este momento. ¿Tiene alguna ramificación?
zerohedge
6

Noté algo similar después de la actualización de El Capitan. Simplemente agregar el archivo .bash_sessions_disableen su directorio de inicio deshabilita las nuevas sesiones de bash y .bash_historyvuelve a estar en uso.

Este hilo de Reddit tiene más información y más enlaces.

rabinos
fuente
Pero no comience simplemente deshabilitando el mecanismo de guardar / restaurar. Si tiene problemas con el historial de comandos de shell, intente resolver ese problema. El ~/.bash_sessions_disablearchivo está pensado como último recurso en caso de que haya un problema que no pueda resolverse específicamente. Deshabilita más que solo el historial de comandos por sesión, y puede deshabilitar solo el historial de comandos por sesión. Vea los comentarios en /etc/bashrc_Apple_Terminalpara más detalles.
Chris Page
Gracias Chris, ¿qué más deshabilita? Mi historial ha estado funcionando como se esperaba (igual que la versión anterior de osx e igual que Linux) durante los últimos meses. ¿No sabes por qué lo cambiaron?
rabs
@rabs sugeriría agregar SHELL_SESSION_HISTORY=0en la parte superior de ~/.bash_profile.
Teejay
5

Puede resolver el problema de RVM actualizando a la última versión de RVM o ejecutando esto:

  echo 'shell_session_update' > $HOME/.bash_logout

Consulte https://github.com/rvm/rvm/issues/3540 para obtener más información.

Alex Rojo
fuente
1
Buena solución, sin tener que modificar rvm.
mlo55
1
¿Estamos hablando del Ruby enVironment Manager (RVM) rvm.io ?? ¿Cuándo y por qué debería involucrarse eso?
MarkHu
3

Esta respuesta del hilo de Reddit me salvó:

Probablemente sea RVM evitando el "gancho" de salida para que bash_sessions se ejecute. Si comenta la siguiente línea en su .bash_profile, debería funcionar.

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
noio
fuente
Esto de hecho ayudó!
Karsten
1

Si es una Mac, supongo que su shell de inicio de sesión predeterminado es bashy se ejecuta en .profilelugar de .bashrc. Entonces, estabas editando el archivo incorrecto.

Theoden
fuente
He editado .profile para que sea el mismo que mi .bashrc, y la historia aún no aparece.
@NelsonLiu ¿Qué sucede cuando haces eco $HISTFILEen diferentes partes de profile? ¿Tal vez obtienes otro script que cambia la variable? Revisé ambos Terminaly iTerm, bash 3y 4 ambos tienen su valor predeterminado $HOME/.bash_history.
Theoden
¿Cómo haría eco de $ HISTFILE en diferentes partes del perfil?
@ Nelsonson, ¿no es obvio? su objetivo es rastrear cuándo $HISTFILEcambia. Por lo tanto, simplemente haga que dos echo $HISTFILErodeen su código. Lo que tiene que hacer es encontrar la pieza de código donde $HISTFILEcambia moviendo ambas echo $HISTFILElíneas cada vez más cerca, línea por línea, hasta que algo se revele. Eso es todo.
Theoden
1
así que hice lo que me indicó e hice .bash_profile lo mismo que perfil. Decidí hacerlo echo $HISTFILEen cada línea, solo para ver si había alguna diferencia. Sin embargo, simplemente imprimió /Users/username/.bash_historyuna miríada de veces. Luego corrí echo $HISTFILEen el shell, y salió /Users/nelsonliu/.bash_sessions/CD275A29-1DF1-4ED8-B8CE-F706B11B812F.historynew.
0

Estaba viendo este problema en High Sierra. De alguna manera, mi propio .bash_history había pasado a ser propiedad de root y ni siquiera tenía permisos de lectura para otros usuarios (cuando los contenidos del directorio de inicio se veían con ls -al)

No hubo ninguna consecuencia en este archivo .bash_history, así que hice un sudo rm .bash_history seguido de un toque .bash_history para crear uno nuevo.

Todo parece bien ahora

Julian Jordan
fuente
Para mí, no fueron los permisos de archivo, fue que no había definido ninguna de las variables de control HIST. Aparentemente uno o más de ellos deben estar definidos. ~/.bash_profileexport HISTTIMEFORMAT='%F %T '
Agregué