a veces los comandos del historial no se almacenan en .bash_history

20

Ayer emití muchos comandos en mi CentOS 7. Pero cuando quería recuperar estos comandos hoy, descubrí que no había ningún registro. Cuando abrí el archivo .bash_history, todavía no podía encontrar los comandos que emití ayer, pero encontré muchos comandos antiguos hace unos días. ¿Por qué no se almacenaron los comandos recientes? ¿Cómo puedo aumentar la capacidad del historial?

Jack
fuente
A veces, cuando el terminal está cerrado de forma anormal, la historia no se guarda, se pasó a mí también, pero no sé las circunstancias que están provocando este comportamiento
mazs

Respuestas:

11

La causa más probable de que los elementos del historial no aparezcan no es establecer HISTFILEnada o HISTSIZEcero, es iniciar sesión en la misma máquina dos veces y salir con la segunda instancia de bash (en la que hizo poco o nada) después de aquella en la que hiciste mucho De manera predeterminada, Bash no combina los historiales y la segunda salida de Bash sobrescribe la .bash_historyque Bash-exit actualizó tan bien.

Para evitar que esto suceda, puede agregar al archivo de historial en lugar de sobrescribir, puede usar la histappendopción de shell:

Si la opción de shell histappend está habilitada (consulte la descripción de shopt en COMANDOS DE CONSTRUCCIÓN SHELL a continuación), las líneas se agregan al archivo de historial; de lo contrario, el archivo de historial se sobrescribe.

Más detalles en esta respuesta , incluyendo cómo utilizar HISTSIZE, HISTFILESIZEy HISTCONTROLpara controlar el tamaño, duplicados, etc.

Anthon
fuente
3

Para modificar el tamaño del historial, use dos variables BASH HISTSIZE, HISTFILESIZE(generalmente configuradas .bashrc).

Descripción de la página de manual de BASH:

HISTSIZE El número de comandos para recordar en el historial de comandos (ver HISTORIAL a continuación). Si el valor es 0, los comandos no se guardan en la lista del historial. Los valores numéricos inferiores a cero dan como resultado que cada comando se guarde en la lista del historial (no hay límite). El shell establece el valor predeterminado en 500 después de leer los archivos de inicio.

HISTFILESIZE El número máximo de líneas contenidas en el archivo de historial. Cuando se asigna un valor a esta variable, el archivo de historial se trunca, si es necesario, para que no contenga más que ese número de líneas eliminando las entradas más antiguas. El archivo de historial también se trunca a este tamaño después de escribirlo cuando sale un shell. Si el valor es 0, el archivo de historial se trunca a tamaño cero. Los valores no numéricos y los valores numéricos inferiores a cero inhiben el truncamiento. El shell establece el valor predeterminado en el valor de HISTSIZE después de leer los archivos de inicio.

Como ejemplo, tengo la siguiente configuración en mi .bashrcarchivo:

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
taza de cafe
fuente
1

Esto sucedió pero la solución no figuraba aquí. La causa fue solo un simple problema de copiar + pegar. Estaba copiando un comando de otro documento y tenía algo de espacio en blanco adicional en el portapapeles. Por alguna razón, esto provocó que Ubuntu no guardara el comando en el archivo de historial.

ingrese la descripción de la imagen aquí

La imagen de arriba era el comando que tenía en mi portapapeles de Google Docs. Este comando se ejecutó pero se omitió de mi historial. Acabo de regresar y seleccioné el comando sin espacios en blanco y luego apareció en el historial de bash.

Tycon
fuente
55
Una de las opciones del historial es ignorar (no guardar) las líneas que comienzan con un espacio. Por lo general, está predeterminado. Esto se puede cambiar en su .bashrc.
studog
1

Verifique que su HISTCONTROLvariable de entorno no esté establecida en ignorespaceo ignoreboth.

$ echo $HISTCONTROL
ignoredups  #this is ok

Puede modificarlo estableciendo el valor en su ~/.bash_profileo su ~/.profilearchivo:

HISTCONTROL=ignoredups

Desde la bashpágina del manual:

HISTCONTROL

Una lista de valores separados por dos puntos que controlan cómo se guardan los comandos en la lista del historial.

Si la lista de valores incluye ignorespace, las líneas que comienzan con un carácter de espacio no se guardan en la lista del historial.

Un valor de ignoredupshace que las líneas que coinciden con la entrada del historial anterior no se guarden.

Un valor de ignorebothes taquigrafía para ignorespacey ignoredups.

Un valor de erasedupshace que todas las líneas anteriores que coincidan con la línea actual se eliminen de la lista del historial antes de guardar esa línea.

Cualquier valor que no esté en la lista anterior se ignora.

Si no HISTCONTROL está configurado o no incluye un valor válido, todas las líneas leídas por el analizador de shell se guardan en la lista del historial, sujetas al valor de HISTIGNORE. La segunda línea y las siguientes de un comando compuesto de varias líneas no se prueban y se agregan al historial independientemente del valor de HISTCONTROL.

gawi
fuente