Si corro history
, puedo ver mis últimos comandos ejecutados.
Pero si lo hago tail -f $HISTFILE
o tail -f ~/.bash_history
, no se enumeran.
¿El archivo se bloquea, hay una ubicación temporal o algo similar?
Si corro history
, puedo ver mis últimos comandos ejecutados.
Pero si lo hago tail -f $HISTFILE
o tail -f ~/.bash_history
, no se enumeran.
¿El archivo se bloquea, hay una ubicación temporal o algo similar?
Respuestas:
Bash mantiene la lista de comandos internamente en la memoria mientras se ejecuta. Están escritos en la .bash_history
salida :
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 -a
comando, 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 -w
opció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_COMMAND
variable:
export PROMPT_COMMAND='history -a'
(No es una respuesta pero no puedo agregar comentarios)
Si está comprobando .bash_history
porque 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 export
línea, simplemente puede lograrlo:
history -d 928
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)
bash
archivo ejecutable. Escribiría "Está almacenado bash
en la memoria, ..."
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_history
antes del apagado.
Por lo tanto, no verá el historial de la sesión actual en .bash_history
.
bash
finalizar, lo que no implica reiniciar (especialmente en entornos gráficos donde puede abrir y cerrar terminales como lo desee).
Mientras se ejecuta, el historial se mantiene solo en la memoria (por defecto) si:
H
in echo "$-"
).0
y*
(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:
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á append
el new
historial 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
.bash_history
archivo se convierte accidentalmente en propiedad de root, las cosas dejan de funcionar. En ese caso, verifique la propiedad y usesudo
para arreglar la propiedad si es necesario.