Linux / Comando / history: consultar y administrar el historial de Bash

history permite consultar y administrar los comandos que recuerda la sesión actual de Bash. Use history 20 para ver los últimos veinte, history | grep 'TEXTO' para buscar una cadena o Ctrl+R para buscar mientras edita.

history es un comando integrado de Bash. Este artículo describe Bash; Zsh y Fish tienen reglas y ajustes propios que no deben copiarse sin comprobarlos.

¿Qué es el comando history?

Bash mantiene una lista de historial en memoria. history consulta o modifica esa lista; HISTFILE identifica el archivo persistente del que puede leerse o al que puede escribirse.

El archivo de registro predeterminado suele ser ~/.bash_history. Cuando inicia Bash, lee este archivo para crear una lista de registros en memoria y, cuando el shell se apaga normalmente, guarda el registro actual en el archivo. Para instrucciones detalladas, consulta documentación de GNU Bash en History Facilities.

El registro de comandos es una función para conveniencia, no es un registro de auditoría de seguridad. Los usuarios pueden eliminar elementos, y si la shell se cierra de manera anormal o la configuración de registro está desactivada, es posible que no se guarden.

Uso básico

Si se ejecuta sin opciones, imprime el registro de la sesión actual de Bash con números.

history

Un ejemplo de salida es el siguiente.

  241  apt update
  242  systemctl status ssh
  243  journalctl -u ssh
  244  history

Para consultar solo los últimos registros recientes, como los últimos 20, se debe especificar un número.

history 20
Formato Función Puntos a tener en cuenta
history n Imprimir los últimos n elementos Se basa en la lista de memoria de la shell actual.
history -c Eliminar todo el registro actual El estado de otras sesiones de shell y archivos debe considerarse por separado.
history -d NÚMERO Eliminar el elemento especificado Primero confirme si el número que va a eliminar es correcto.
history -a Agregar nuevos elementos de esta sesión al final del archivo HISTFILE debe estar configurado.
history -n Agregar nuevos elementos del archivo a la lista actual Es útil cuando se importan registros agregados desde otras sesiones.
history -r Agregar todo el archivo de registros a la lista actual Puede duplicarse con elementos que ya existen.
history -w Sobrescribir el archivo de registro con la lista actual Si hay varios terminales abiertos, puede afectar a los registros de otras sesiones.
history -p EXPRESIÓN Mostrar solo el resultado de la expansión del historial Útil para verificar el resultado de la expansión ! antes de ejecutarlo.
history -s COMANDO Agregar al historial sin ejecutar el comando Se agregará como el último elemento de la lista del historial actual.

La definición exacta y el estado de retorno de cada opción se pueden consultar en la documentación de History Builtins de GNU Bash.

Buscar comandos anteriores

Filtrar listas con grep

Si desea ver solo las líneas del registro que contienen una cadena específica, utilice grep junto con una tubería.

history | grep 'systemctl'

Para que no distinga entre mayúsculas y minúsculas, use grep -i.

history | grep -i 'nginx'

Este método es conveniente para revisar los resultados, pero el comando de búsqueda actual también puede aparecer en los resultados.

Buscar mientras se escribe con Ctrl+r

Si Bash utiliza el modo de edición Emacs básico, puede realizar una búsqueda incremental inversa de comandos anteriores con Ctrl+r. Cada vez que introduzca un carácter de búsqueda, se mostrará la coincidencia más reciente, y al presionar Ctrl+r nuevamente, se avanzará al siguiente resultado más antiguo.

  • Enter: ejecuta el comando mostrado.
  • Tecla de flecha izquierda/derecha: Termina la búsqueda y edita el comando.
  • Ctrl+g: Cancela la búsqueda y vuelve a la entrada original.

Es seguro acostumbrarse a finalizar la búsqueda con las teclas de flecha antes de ejecutar inmediatamente, para revisar el comando y sus argumentos. El método de búsqueda está explicado en el documento de búsqueda en historial de comandos de GNU Readline.

Ejecutar comandos anteriores nuevamente

Expansión de historial usando signo de exclamación

En Bash interactivo, puede usar la expansión de historial (history expansion) que comienza con ! para llamar comandos anteriores.

Expresión Significado Ejemplo
!! Comando inmediatamente anterior sudo !! antepone sudo al comando anterior.
!125 Comando del número de registro 125 El número se verifica en la salida de history.
!-3 El tercer comando anterior desde la posición actual Selecciona el comando reciente por posición relativa.
!ssh El comando más reciente que comienza con ssh Si hay muchos comandos con el mismo prefijo, se puede seleccionar un elemento diferente al esperado.
!?nginx? El comando más reciente que contiene nginx Busca dentro de la cadena en medio del comando.
^ANTERIOR^NUEVO^ Reemplaza la primera coincidencia del comando anterior y ejecuta. Se utiliza cuando se corrige un error tipográfico corto y se vuelve a ejecutar.

La expansión del historial está activada por defecto en Bash interactivo y no se realiza de forma predeterminada en scripts de shell no interactivos. La sintaxis detallada se puede consultar en Documentación de la expansión del historial de GNU Bash.

Verificar el resultado de la expansión antes de ejecutar.

!NÚMERO y !PREFIJO permiten ejecutar directamente el comando encontrado, por lo que se debe tener especial cuidado si hay comandos de eliminación, cambio de permisos o cierre del sistema en el historial. Si se pasa la expresión entre comillas a history -p, se puede verificar solo el resultado de la expansión sin ejecutarla.

history -p '!!'
history -p '!ssh'

En Bash que utiliza Readline, al configurar la siguiente opción, se puede mostrar primero el resultado de la expansión en el buffer de edición sin ejecutarlo de inmediato.

shopt -s histverify

En entornos de terminales donde los números son propensos a cambiar, a menudo es más seguro buscar el contenido con Ctrl+r y luego ejecutarlo.

Eliminar el historial de comandos

Eliminar un ítem específico

Eliminar entradas cambia el historial y puede perder información útil. Si necesita conservarla, guarde primero una copia del archivo en una ubicación privada y coordine las otras sesiones. Compruebe con history el número actual antes de usar -d; los números siguientes son ejemplos, no selecciones que deba ejecutar a ciegas.

history -d 125

Si el Bash actual admite eliminación por rango, también puede especificar el número de inicio y fin.

history -d 120-125

Para reflejar los resultados de la eliminación en el archivo de historial actual, puede ejecutar history -w después de verificar la lista. Sin embargo, debe confirmar que no hay otras sesiones de terminal abiertas, ya que podrían cerrarse más tarde y reescribir el historial anterior en el archivo.

Eliminar toda la lista actual

La opción -c borra toda la lista de historial que está en la memoria del shell actual.

history -c

Para actualizar el archivo de historial con la lista actual, debe usar comprendiéndolo bien el comportamiento de history -w. La eliminación de historial solo se aplica al historial del shell y no elimina registros del sistema, registros de auditoría, copias de seguridad u otros historiales de terminal.

Archivos de registro y múltiples sesiones de terminal

Bash tiene una lista de historial en memoria separada para cada shell que se ejecuta. En el comportamiento predeterminado, los comandos recién ejecutados en otra terminal pueden no aparecer inmediatamente en history de la terminal actual.

Comando Comportamiento entre archivos de historial y la sesión actual
history -a Agrega al final del archivo los nuevos registros de la sesión actual que aún no se han guardado en el archivo.
history -n Agrega a la lista en memoria las nuevas líneas del archivo de historial que la sesión actual aún no ha leído.
history -r Agrega todo el contenido del archivo de historial al final de la lista de memoria actual.
history -w Sobrescribe el archivo de historial con toda la lista de memoria actual.

Para obtener los nuevos registros de otra terminal, primero añádalos al archivo desde esa terminal usando history -a y luego léelos en la terminal actual con history -n.

history -a
history -n

Para que el archivo de registro agregue nuevas entradas en lugar de sobrescribirse al cerrar la shell, se puede usar la opción histappend.

shopt -s histappend

Para continuar usando esta configuración, añádala a ~/.bashrc del usuario. También existe una forma de configurar PROMPT_COMMAND para sincronizar automáticamente en cada indicador en varias terminales, pero como la configuración o programas existentes podrían estar usando esta variable, no se debe sobrescribir sin verificar el valor actual.

Variables de Bash para configurar el historial

Variable Rol
HISTFILE Ruta del archivo donde se guardará el registro. El valor predeterminado común es ~/.bash_history.
HISTSIZE Número máximo de comandos que se conservarán en la lista de memoria del shell actual.
HISTFILESIZE Limita el tamaño máximo del archivo de registro en términos de líneas.
HISTCONTROL Configura reglas de guardado, como no registrar comandos que comiencen con espacios o comandos duplicados consecutivos.
HISTIGNORE Especifica patrones de comandos que se deben excluir del registro, separados por dos puntos.
HISTTIMEFORMAT history especifica el formato de fecha y hora que se mostrará en la salida.

Por ejemplo, la siguiente configuración mantiene un registro de nivel de 5,000 en la memoria y 10,000 en el archivo de registro, reduce los comandos que comienzan en blanco y los comandos duplicados, y muestra la fecha y la hora.

HISTSIZE=5000
HISTFILESIZE=10000
HISTCONTROL=ignoreboth:erasedups
HISTTIMEFORMAT='%F %T '
shopt -s histappend

Para conservar estos ajustes, revise primero las definiciones existentes en ~/.bashrc, haga una copia y añada o modifique solo las necesarias. Abrir una sesión nueva evita volver a ejecutar a ciegas todas las órdenes de inicialización; source ~/.bashrc ejecuta el archivo completo. Para revertir, restaure las líneas guardadas y abra otro Bash. HISTTIMEFORMAT muestra marcas de tiempo disponibles, pero no reconstruye las que nunca se guardaron.

source ~/.bashrc

HISTCONTROL=ignoreboth se aplica junto con ignorespace y ignoredups. erasedups elimina de la lista de registros las entradas anteriores que son iguales a un comando nuevo. Las reglas detalladas por variable se pueden consultar en la documentación de variables de GNU Bash.

Registro de comandos y seguridad

Si introduce contraseñas, claves API, tokens y contenido de claves privadas como argumentos de línea de comandos, pueden exponerse no solo en el historial de la shell, sino también en la información de procesos en ejecución u otros registros. Se recomienda no ingresar información sensible directamente en la línea de comandos, sino usar la entrada estándar proporcionada por el programa, un almacén seguro de credenciales o un archivo de configuración con permisos restringidos.

Si ignorespace está configurado en HISTCONTROL, puede excluir comandos que comiencen con un espacio del historial. Sin embargo, debe depender de si la configuración está realmente activa y no bloquea otros registros, por lo que no se debe confiar solo en esto como método de protección de información sensible.

printf '%s\n' "$HISTCONTROL"
printf '%s\n' "$HISTFILE"

Incluso si elimina elementos con history -d o history -c, la misma información puede permanecer en otras sesiones de shell, copias de seguridad, registros de auditoría y registros de aplicaciones. Si las credenciales se han expuesto, no solo elimine el historial, sino que debe invalidar la contraseña o el token correspondiente y emitir uno nuevo.

Problemas comunes

No se ven los comandos más recientes de otra terminal

Cada sesión de Bash usa una lista de memoria independiente. Después de ejecutar history -a en la terminal donde se ejecutó el comando, pruebe ejecutando history -n en la terminal donde desea verificarlo. A largo plazo, puede revisar histappend y la configuración de inicialización del shell.

El historial desapareció después de cerrar la terminal

Verifique si HISTFILE está vacío o si no tiene permisos para escribir en el archivo de historial, y si HISTSIZE y HISTFILESIZE no están configurados en 0. Si el shell se cerró de forma forzada, es posible que el proceso de guardar el historial al momento de cerrar no se haya realizado.

El número de history ha cambiado respecto al anterior

El número de registro no es un identificador fijo, sino la posición actual en la lista de memoria. Si se eliminan elementos o se vuelve a leer el archivo y se fusionan los registros de otra sesión, el número puede cambiar. Es más seguro buscar primero y verificar el contenido del comando en lugar de recordar números antiguos y ejecutarlos.

¿Se pueden usar los mismos ajustes en Zsh o Fish?

No se pueden aplicar directamente a Zsh o Fish. $SHELL suele identificar el shell de inicio de sesión, no garantiza cuál está ejecutándose ahora. En Bash, printf '%s\n' "$BASH_VERSION" permite consultar su versión; contraste también cómo inició la sesión o el intérprete antes de aplicar sus ajustes.

Resumen

history se puede usar en Bash no solo para consultar comandos anteriores, sino también para eliminar elementos específicos, leer y escribir archivos de registro y sincronizar entre sesiones. Para búsquedas cotidianas, history | grep y Ctrl+r son convenientes, y al ejecutar de nuevo mediante extensión de historial, primero debe verificar el contenido del comando.

Para cambiar la cantidad de registros y la manera de almacenarlos, revise conjuntamente HISTSIZE, HISTFILESIZE, HISTCONTROL, HISTTIMEFORMAT y histappend. El uso de otros comandos se puede consultar según la tarea en lista de comandos de Linux.