Linux

Cómo guardar un historial de comandos Bash prácticamente ilimitado en Linux

Configura Bash para no recortar el historial, conservar comandos entre sesiones y evitar que varias terminales sobrescriban tu archivo de history.

Bash guarda los comandos que escribes para que puedas recuperarlos posteriormente con las flechas del teclado, history o la búsqueda inversa. Sin embargo, la configuración predeterminada limita cuántos comandos conserva y, dependiendo de cómo esté configurado el shell, varias sesiones de terminal también pueden terminar sobrescribiendo parte del historial.

GNU Bash permite eliminar prácticamente esos límites mediante HISTSIZE y HISTFILESIZE. Si ambas variables reciben un valor numérico negativo, Bash deja de imponer un máximo de entradas en memoria y deja de truncar el archivo de historial. Activar además histappend evita que una sesión sobrescriba el archivo completo cuando termina.

Comprueba primero que realmente utilizas Bash

Esta configuración es específica de Bash. No debes copiarla directamente si utilizas Zsh, Fish u otro shell.

En una terminal ejecuta:

bash
printf '%sn' "$BASH_VERSION"

Si aparece un número de versión de Bash, puedes continuar. Si la variable está vacía, comprueba qué shell estás utilizando antes de modificar archivos de configuración.

Comprueba cómo está configurado ahora tu historial

Antes de realizar cambios puedes ver los valores actuales:

bash
printf 'HISTSIZE=%snHISTFILESIZE=%snHISTFILE=%sn' "$HISTSIZE" "$HISTFILESIZE" "$HISTFILE" shopt -p histappend

Normalmente, el archivo utilizado para guardar el historial es ~/.bash_history.

HISTSIZE y HISTFILESIZE controlan cosas diferentes, por lo que conviene configurar ambos.

Qué diferencia hay entre HISTSIZE y HISTFILESIZE

HISTSIZE establece cuántos comandos mantiene Bash en la lista de historial de la sesión actual.

HISTFILESIZE controla el tamaño máximo del archivo de historial almacenado en disco.

Por ejemplo, tener un HISTSIZE muy grande pero un HISTFILESIZE pequeño puede provocar que parte del historial termine desapareciendo del archivo cuando Bash lo guarda.

GNU Bash documenta que un valor numérico inferior a cero elimina el límite de HISTSIZE. En el caso de HISTFILESIZE, un valor negativo impide que Bash trunque el archivo de historial.

Cómo configurar un historial Bash sin límite fijo

La configuración habitual de Bash para una cuenta de usuario se encuentra en ~/.bashrc.

Antes de modificarlo puedes crear una copia de seguridad:

bash
cp ~/.bashrc ~/.bashrc.backup

Después abre el archivo con tu editor preferido. Por ejemplo:

bash
nano ~/.bashrc

Añade estas líneas:

bash
HISTSIZE=-1 HISTFILESIZE=-1 shopt -s histappend

Guarda el archivo y cierra el editor.

Qué hace exactamente esta configuración

La primera línea:

bash
HISTSIZE=-1

indica a Bash que no aplique un límite numérico a la cantidad de comandos que conserva en su lista de historial.

La segunda:

bash
HISTFILESIZE=-1

evita que Bash recorte ~/.bash_history a un número máximo de líneas cuando guarda el historial.

Finalmente:

bash
shopt -s histappend

hace que Bash añada las nuevas entradas al archivo de historial al salir de una sesión en lugar de sustituir el contenido existente por la lista de esa sesión.

Aplica los cambios sin cerrar la terminal

Puedes abrir una terminal nueva o volver a cargar ~/.bashrc en la sesión actual:

bash
source ~/.bashrc

Comprueba después los nuevos valores:

bash
printf 'HISTSIZE=%snHISTFILESIZE=%sn' "$HISTSIZE" "$HISTFILESIZE" shopt -p histappend

Deberías ver valores negativos para las dos variables y una salida indicando que histappend está activado.

Por qué histappend es importante si abres varias terminales

Bash carga normalmente el historial desde HISTFILE cuando comienza una sesión. Al salir, guarda el historial de esa sesión.

Si histappend está desactivado, Bash puede escribir su propia lista sustituyendo el contenido anterior del archivo. Esto es especialmente problemático cuando tienes varias terminales abiertas simultáneamente.

Con histappend, las nuevas entradas se añaden al archivo existente en lugar de sobrescribirlo.

Cómo guardar inmediatamente los comandos de la sesión actual

Incluso con histappend, no necesitas esperar siempre a cerrar Bash para escribir los nuevos comandos en el archivo.

GNU Bash incluye:

bash
history -a

Este comando añade a HISTFILE las líneas nuevas introducidas durante la sesión actual que todavía no se habían guardado.

Puede resultar útil antes de cerrar una terminal de forma poco habitual, trabajar mediante SSH o realizar una operación después de la que quieres asegurarte de conservar inmediatamente el historial.

Cómo cargar comandos guardados por otra terminal

Si tienes varias sesiones de Bash abiertas, puedes leer las nuevas entradas que otras sesiones hayan añadido al archivo mediante:

bash
history -n

GNU Bash define history -n precisamente para leer las líneas del archivo de historial que la sesión actual todavía no había cargado.

Una combinación útil cuando trabajas con varias terminales es:

bash
history -a history -n

La primera orden guarda los comandos nuevos de la terminal actual y la segunda incorpora los que otras sesiones hayan añadido al mismo archivo.

No reemplaces PROMPT_COMMAND a ciegas

Es posible automatizar history -a y history -n para ejecutarlos cada vez que aparece el prompt. Sin embargo, muchas distribuciones, herramientas de desarrollo y configuraciones personalizadas ya utilizan la variable PROMPT_COMMAND.

Por eso no conviene copiar una línea de Internet que sustituya completamente esa variable sin revisar antes su contenido:

bash
printf '%sn' "$PROMPT_COMMAND"

Si necesitas sincronización automática entre múltiples terminales, integra las operaciones de history conservando cualquier configuración existente en lugar de sobrescribirla.

Cómo guardar también la fecha y hora de los comandos

Puedes hacer que history muestre la fecha y la hora asociadas a las entradas definiendo HISTTIMEFORMAT.

Por ejemplo, añade a ~/.bashrc:

bash
HISTTIMEFORMAT='%F %T '

Después recarga la configuración:

bash
source ~/.bashrc

Al ejecutar:

bash
history

las entradas pueden mostrarse con un formato similar a:

text
2026-10-07 22:15:03 ls -lah 2026-10-07 22:15:10 git status

GNU Bash también utiliza esta información para conservar marcas de tiempo asociadas a las entradas en el archivo de historial.

Un historial ilimitado también puede guardar contraseñas y claves API

Conservar prácticamente todos los comandos tiene una consecuencia de seguridad importante: cualquier secreto escrito directamente en la línea de comandos puede terminar almacenado durante años en ~/.bash_history.

Esto puede incluir:

  • claves API;
  • tokens de acceso;
  • contraseñas escritas como argumentos;
  • URLs que contienen credenciales;
  • comandos con secretos de bases de datos;
  • credenciales utilizadas con herramientas HTTP o servicios en la nube.

Siempre que sea posible, evita escribir secretos literalmente en un comando. Utiliza mecanismos específicos de credenciales, variables de entorno gestionadas de forma segura, archivos protegidos o entrada interactiva cuando la herramienta lo permita.

Puedes evitar que algunos comandos entren en el historial

Bash dispone de HISTCONTROL para decidir qué comandos deben conservarse.

Una configuración habitual es:

bash
HISTCONTROL=ignoreboth

ignoreboth combina dos comportamientos: evita guardar comandos duplicados consecutivos y excluye las líneas que comienzan con un espacio.

Con esa opción activa, un comando iniciado deliberadamente con un espacio puede quedar fuera del historial:

bash
comando-sensible

Sin embargo, no debes tratar esto como un gestor de secretos. Solo evita que esa línea entre en el historial de Bash cuando se cumplen las condiciones correspondientes. El comando todavía puede dejar información en otros lugares, como registros de la aplicación, archivos temporales o la lista de procesos.

Si ya tienes una configuración personalizada de HISTCONTROL, revísala antes de sustituirla.

Cómo borrar un comando sensible que ya aparece en el historial

Primero localiza la entrada:

bash
history

Después elimina el número correspondiente de la lista actual:

bash
history -d NUMERO

Por ejemplo:

bash
history -d 1542

El builtin history también permite escribir la lista actual al archivo mediante history -w, pero esta operación sobrescribe el archivo con la lista que tiene cargada esa sesión. Si trabajas con varias terminales simultáneamente, evita utilizarla sin entender el efecto sobre el historial compartido.

Y si el comando contenía una contraseña, token o clave API real, eliminarlo del historial no vuelve seguro automáticamente ese secreto. Si existe la posibilidad de que haya quedado expuesto, revócalo o cámbialo.

Comprueba los permisos de.bash_history

El historial puede contener rutas, nombres de servidores, comandos administrativos y otra información sensible. Comprueba sus permisos con:

bash
ls -l ~/.bash_history

Si necesitas restringir el archivo para que solo tu usuario pueda leerlo y escribirlo:

bash
chmod 600 ~/.bash_history

Esto no protege el historial frente a un usuario que ya tenga acceso administrativo al sistema, pero evita permisos excesivamente abiertos sobre el archivo.

Cuánto puede crecer un historial sin límite

Usar valores negativos no significa que Bash borre nunca automáticamente las entradas antiguas por tamaño. El archivo puede continuar creciendo mientras sigas utilizando el mismo usuario.

Para la mayoría de usuarios, el texto de los comandos ocupa relativamente poco espacio frente a otros archivos, pero en sistemas utilizados durante muchos años o con una actividad muy elevada conviene revisar periódicamente:

bash
du -h ~/.bash_history wc -l ~/.bash_history

Si prefieres evitar un archivo que crezca indefinidamente, puedes sustituir los valores negativos por un límite alto, por ejemplo decenas o cientos de miles de entradas.

Configuración recomendada para conservar el historial

Si quieres una configuración sencilla que no aplique un límite fijo y reduzca el riesgo de que una sesión sobrescriba las anteriores, las líneas esenciales en ~/.bashrc son:

bash
HISTSIZE=-1 HISTFILESIZE=-1 shopt -s histappend

Después utiliza history -a cuando quieras escribir inmediatamente los comandos nuevos y history -n cuando necesites importar entradas guardadas por otras sesiones.

La contrapartida de conservar más historial es también conservar más información potencialmente sensible. Antes de convertir ~/.bash_history en un registro de años de trabajo, revisa cómo introduces contraseñas, tokens y claves API y protege adecuadamente el archivo.