¿Dónde se almacena la historia de bash?

95

Si corro history, puedo ver mis últimos comandos ejecutados.

Pero si lo hago tail -f $HISTFILEo tail -f ~/.bash_history, no se enumeran.

¿El archivo se bloquea, hay una ubicación temporal o algo similar?

Adionditsak
fuente

Respuestas:

117

Bash mantiene la lista de comandos internamente en la memoria mientras se ejecuta. Están escritos en la .bash_historysalida :

Cuando sale un shell interactivo, las últimas líneas $ HISTSIZE se copian de la lista del historial al archivo nombrado por $ HISTFILE

Si desea forzar la escritura del historial de comandos, puede usar el history -acomando, que:

Agregue las nuevas líneas de historial (líneas de historial ingresadas desde el comienzo de la sesión Bash actual) al archivo de historial.

También hay una -wopción:

Escriba el historial actual en el archivo de historial.

lo cual puede ser más adecuado para usted, dependiendo de cómo use su historial.

Si desea asegurarse de que siempre se escriben de inmediato, puede poner ese comando en su PROMPT_COMMANDvariable:

export PROMPT_COMMAND='history -a'
Michael Homer
fuente
Nota al margen: si su .bash_historyarchivo se convierte accidentalmente en propiedad de root, las cosas dejan de funcionar. En ese caso, verifique la propiedad y use sudopara arreglar la propiedad si es necesario.
torek
13

(No es una respuesta pero no puedo agregar comentarios)

Si está comprobando .bash_historyporque solo desea eliminar un comando específico (por ejemplo, que contiene una contraseña en borrar), puede eliminar directamente la entrada en la memoria mediante history -d <entry_id>.

Por ejemplo, suponiendo una salida como:

$ history
926  ll
927  cd ..
928  export --password=super_secret
929  ll

y desea purgar la exportlínea, simplemente puede lograrlo:

history -d 928
Eddie C.
fuente
11

bash lo mantiene en la memoria de trabajo, bash se puede configurar para guardarlo cuando bash se cierra o después de cada comando, y para cargarse cuando se inicia bash o cuando se solicita.

Si configura para guardar después de cada comando, considere las implicaciones de tener múltiples bash ejecutándose al mismo tiempo. (las líneas de comando se intercalarán)

ctrl-alt-delor
fuente
2
El comienzo de su respuesta hace que parezca que el historial está almacenado en un archivo llamado bash, o incluso en el basharchivo ejecutable. Escribiría "Está almacenado bashen la memoria, ..."
Anthon
eso es realmente mejor
Anthon
5

Los comandos se guardan en la memoria (RAM) mientras su sesión está activa. Tan pronto como cierre el shell, la lista de comandos se escribe .bash_historyantes del apagado.

Por lo tanto, no verá el historial de la sesión actual en .bash_history.

JaySo
fuente
44
El archivo de historial se actualiza al bashfinalizar, lo que no implica reiniciar (especialmente en entornos gráficos donde puede abrir y cerrar terminales como lo desee).
John WH Smith
4

Mientras se ejecuta, el historial se mantiene solo en la memoria (por defecto) si:

  • Se establece set -o history (an Hin echo "$-").
  • HISTSIZE no es 0 y
  • HISTIGNORE no lo es *(o algún otro patrón muy restrictivo).

Si alguno de los anteriores falla, no se almacena ningún historial en la memoria y, en consecuencia, ningún historial podría o se escribirá en el disco.

El historial en la memoria se escribe en el disco si:

  • HISTFILESIZE no es 0 y
  • HISTFILE no está desarmado.

Pero solo cuando el shell sale o si se ejecutan los comandos history -a(agregar) o history -w(escribir).

Para activar una escritura inmediata en el disco puede usar la variable:

 PROMPT_COMMAND='history -a'

cuál será appendel newhistorial de líneas al archivo de historial. Estas son líneas de historial ingresadas desde el comienzo de la sesión de bash actual, pero que aún no se han agregado al archivo de historial.

O:

 PROMPT_COMMAND='history -w'

Para sobrescribir el historial en el HISTFILE con la lista de memoria.

Por lo tanto, puede eliminar un comando del historial en la memoria:

 $ history 5
  6359  ls
  6360  cd ..
  6361  comand --private-password='^%^&$@#)!@*'
  6362  top
  6363  set +o | less
 $ history -d 6361
 $ history 5
  6359  ls
  6360  cd ..
  6361  top
  6362  set +o | less
 $ history -w

Y escríbelo en el disco con el último comando:

 history -w    # with `shopt -u histappend` unset
Isaac
fuente
¿Habría algo malo al poner esto en un trabajo cron? Sospecho que muchos usuarios con muchos menos nombres de usuario están iniciando sesión en un servidor en particular y aún así el historial es bastante pequeño y este es un servidor antiguo, pero tal vez alguna sesión nunca se cierre ...
oneindelijk