Un indicador de terminal en una computadora portátil con Linux.

El shell de Linux guarda un historial de los comandos que ejecuta, y puede buscarlo para repetir los comandos que ha ejecutado en el pasado. Una vez que comprenda el comando de historial de Linux y cómo usarlo, puede aumentar significativamente su productividad.

Manipular la historia

Como dijo George Santayana, "aquellos que no pueden recordar el pasado están condenados a repetirlo". Desafortunadamente, en Linux, si no puede recordar el pasado, no puede repetirlo, incluso si lo desea.

Ahí es cuando el historycomando de Linux resulta útil. Te permite revisar y repetir tus comandos anteriores. Esto no tiene la intención de fomentar la pereza o ahorrar tiempo; también hay un factor de eficiencia (y precisión) en juego. Cuanto más largo y complicado sea un comando, más difícil será recordarlo y escribirlo sin cometer un error. Hay dos tipos de errores: uno que impide que el comando funcione y otro que permite que el comando funcione, pero hace que haga algo inesperado.

El  historycomando elimina esos problemas. Como la mayoría de los comandos de Linux, hay más de lo que piensasSin embargo, si aprende a usar el historycomando, puede mejorar su uso de la línea de comandos de Linux, todos los días. Es una buena inversión de tu tiempo. Hay formas mucho mejores de usar el history comando que simplemente  presionar la flecha hacia arriba repetidamente.

El comando de la historia

En su forma más simple, puede usar el historycomando simplemente escribiendo su nombre:

historia

El comando "historial" en una ventana de terminal.

La lista de comandos utilizados anteriormente se escribe en la ventana de la terminal.

Un ejemplo de salida del comando "historial" en una ventana de terminal.

Los comandos están numerados, con los usados ​​más recientemente (aquellos con los números más altos) al final de la lista.

Para ver una cierta cantidad de comandos, puede pasar un número historyen la línea de comandos. Por ejemplo, para ver los últimos 10 comandos que ha utilizado, escriba lo siguiente:

historia 10

El comando "history 10" en una ventana de terminal.

Puede lograr el mismo resultado si canaliza a history través del tailcomandoPara hacerlo, escriba lo siguiente:

historia | cola -n 10

El comando "history | tail -n 10" en una ventana de terminal.

Comandos repetidos

Si desea reutilizar un comando de la lista del historial, escriba un signo de exclamación (!) Y el número del comando sin espacios entre ellos.

Por ejemplo, para repetir el comando número 37, debe escribir este comando:

! 37

Un comando "! 37" en una ventana de terminal.

Para repetir el último comando, escriba dos signos de exclamación, nuevamente, sin espacios:

!!

Un "!!"  comando en una ventana de terminal.

Esto puede resultar útil cuando emite un comando y se olvida de utilizarlo sudoEscriba sudo, un espacio, los signos de exclamación dobles y luego presione Enter.

Para el siguiente ejemplo, escribimos un comando que requiere sudoEn lugar de volver a escribir toda la línea, podemos guardar un montón de pulsaciones de teclas y simplemente escribir  sudo !!, como se muestra a continuación:

mv ./my_script.sh / usr / local / bin /
sudo !!

Un comando "mv ./my_script.sh / usr / local / bin /" en una ventana de terminal.

Por lo tanto, puede escribir el número correspondiente de la lista para repetir un comando o usar los signos de exclamación dobles para repetir el último comando que utilizó. Sin embargo, ¿qué sucede si desea repetir el quinto u octavo comando?

Puede usar un signo de exclamación, un guión (-) y el número de cualquier comando anterior (nuevamente, sin espacios) para repetirlo.

Para repetir el decimotercer comando anterior, debe escribir lo siguiente:

! -13

Un comando "! -13" en una ventana de terminal.

Búsqueda de comandos por cadena

Para repetir el último comando que comienza con una cadena en particular, puede escribir un signo de exclamación y luego la cadena sin espacios y luego presionar Enter.

Por ejemplo, para repetir el último comando que comenzó con sudo, debe escribir este comando:

! sudo

Un comando "! Sudo" en una ventana de terminal.

Sin embargo, hay un elemento de peligro en esto. Si el último comando que comenzó con sudo no es el que cree que es, ejecutará el comando incorrecto.

Sin embargo, para proporcionar una red de seguridad, puede usar el :pmodificador (imprimir), como se muestra a continuación:

! sudo: p

Un comando "! Sudo: p" en una ventana de terminal.

Esto indica historyque se imprima el comando en la ventana del terminal, en lugar de ejecutarlo. Esto le permite ver el comando antes de usarlo. Si es el comando que desea, presione la flecha hacia arriba y luego presione Entrar para usarlo.

Si desea encontrar un comando que contenga una cadena en particular, puede usar un signo de exclamación y un signo de interrogación.

Por ejemplo, para buscar y ejecutar el primer comando coincidente que contiene la palabra "alias", debe escribir este comando:

!? alias

Un comando "!? Alias" en una ventana de terminal.

Esto encontrará cualquier comando que contenga la cadena "alias", independientemente de dónde aparezca en la cadena.

Búsqueda interactiva

Una búsqueda interactiva le permite recorrer una lista de comandos coincidentes y repetir el que desee.

Simplemente presione Ctrl + r para iniciar la búsqueda.

Una ventana de terminal después de presionar "Ctrl + r".

A medida que escribe la pista de búsqueda, aparecerá el primer comando coincidente. Las letras que escribe aparecen entre la comilla invertida (`) y el apóstrofo ('). Los comandos coincidentes se actualizan a medida que escribe cada letra.

Una búsqueda "Ctrl + r" con "sudo" escrito como pista de búsqueda.

Cada vez que presiona Ctrl + r, está buscando hacia atrás el siguiente comando coincidente, que aparece en la ventana de la terminal.

Una búsqueda "Ctrl + r" que muestra un comando coincidente en una ventana de terminal.

Cuando presione Entrar, se ejecutará el comando mostrado.

El comando "gedit" en una ventana de terminal se inicia desde un comando de búsqueda "Ctrl + r".

Para editar un comando antes de ejecutarlo, presione la tecla de flecha izquierda o derecha.

Una búsqueda "Ctrl + r" en una ventana de terminal.

El comando aparece en la línea de comandos y puede editarlo.

Un comando en la línea de comandos con la edición habilitada.

Puede usar otras herramientas de Linux para buscar en la lista del historial. Por ejemplo, para canalizar la salida desde historydentro grep y buscar comandos que contienen la cadena “alias” que podría utilizar este comando:

historia | alias de grep

El comando "history | grep aliases" en una ventana de terminal.

Modificar el último comando

Si necesita corregir un error tipográfico y luego repetir el comando, puede usar el signo de intercalación (^) para modificarlo. Este es un gran truco para tener bajo la manga cada vez que escribe mal un comando o quiere volver a ejecutar uno con una opción o parámetro de línea de comandos diferente.

Para usarlo, escriba (sin espacios) un signo de intercalación, el texto que desea reemplazar, otro signo de intercalación, el texto con el que desea reemplazarlo, otro signo de intercalación y luego presione Entrar.

Por ejemplo, suponga que escribe el siguiente comando, escribiendo accidentalmente "shhd" en lugar de "sshd":

sudo systemctl start shhd

Puede corregir esto fácilmente escribiendo lo siguiente:

^ shhd ^ sshd ^

Un comando "sudo systemctl start shhd" en una ventana de terminal.

El comando se ejecuta con "shhd" corregido a "sshd".

Eliminar comandos de la lista del historial

También puede eliminar comandos de la lista del historial con la -dopción (eliminar). No hay razón para mantener su comando mal escrito en la lista del historial.

Puede usar greppara encontrarlo, pasar su número a historycon la -dopción de eliminarlo y luego buscar nuevamente para asegurarse de que se haya ido:

historia | grep shhd
historia -d 83
historia | grep shhd

El comando "history | grep shhd" en una ventana de terminal.

También puede pasar una serie de comandos a la -dopción. Para eliminar todas las entradas de la lista de 22 a 32 (inclusive), escriba este comando:

historia -d 22 32

Para eliminar solo los últimos cinco comandos, puede escribir un número negativo, así:

historia -d -5

Actualización manual del archivo de historial

Cuando inicia sesión o abre una sesión de terminal, la lista del historial se lee desde el archivo de historial. En Bash, el archivo histórico predeterminado es .bash_history.

Cualquier cambio que realice en la sesión actual de la ventana del terminal solo se escribe en el archivo de historial cuando cierra la ventana del terminal o cierra la sesión.

Suponga que desea abrir otra ventana de terminal para acceder a la lista completa del historial, incluidos los comandos que escribió en la primera ventana de terminal. La -aopción (todo) le permite hacer esto en la primera ventana de terminal antes de abrir la segunda.

Para usarlo, escriba lo siguiente:

historia -a

El comando "history -a" en una ventana de terminal.

Los comandos se escriben silenciosamente en el archivo histórico.

Si desea escribir todos los cambios en la lista del historial en el archivo de historial (si eliminó algunos comandos antiguos, por ejemplo), puede usar la -wopción (escribir), así:

historia -w

El comando "history -w" en una ventana de terminal.

Borrar la lista del historial

Para borrar todos los comandos de la lista del historial, puede usar la -copción (borrar), de la siguiente manera:

historia -c

history -c en una ventana de terminal

Si además desea forzar estos cambios en el archivo de historial, use la -wopción, así:

historia -w

Seguridad e historial de archivos

Si utiliza alguna aplicación que requiera que escriba información confidencial (como contraseñas) en la línea de comando, recuerde que esto también se guardará en el archivo de historial. Si no desea que se guarde cierta información, puede usar la siguiente estructura de comandos para eliminarla de la lista del historial de inmediato:

aplicación-especial mi-contraseña-secreta; historial -d $ (historial 1)
historia 5

Un comando "aplicación-especial mi-contraseña-secreta; historial -d $ (historial 1)" en una ventana de terminal.

Esta estructura incluye dos comandos separados por punto y coma (;). Analicemos esto:

  • special-app : el nombre del programa que estamos usando.
  • my-secret-password : la contraseña secreta que debemos proporcionar para la aplicación en la línea de comando. Este es el final del comando uno.
  • history -d : En el comando dos, invocamos la -dopción (eliminar) de historyLo que vamos a eliminar se encuentra en la siguiente parte del comando.
  • $ (historial 1) : utiliza una sustitución de comando. La parte del comando contenida en  $() se ejecuta en una subshell. El resultado de esa ejecución se publica como texto en el comando original. El history 1comando devuelve el comando anterior. Entonces, puede pensar en el segundo comando como history -d "último comando aquí".

Puede usar el history 5comando para asegurarse de que el comando que contiene la contraseña se haya eliminado de la lista del historial.

Sin embargo, hay una forma aún más sencilla de hacer esto. Debido a que Bash ignora las líneas que comienzan con un espacio de forma predeterminada, solo incluya un espacio al comienzo de la línea, de la siguiente manera:

 aplicación especial otra contraseña
historia 5

Un comando "otra-contraseña de aplicación especial" en una ventana de terminal.

El comando con la contraseña no se agrega a la lista del historial. La razón por la que funciona este truco está contenida en el .bashrcarchivo.

El archivo .bashrc

El  .bashrc archivo se ejecuta cada vez que inicia sesión o abre una ventana de terminal. También contiene algunos valores que controlan el comportamiento del historycomando. Vamos a editar este archivo con gedit.

Escriba lo siguiente:

gedit .bashrc

El comando "gedit .bashrc" en una ventana de terminal.

Cerca de la parte superior del archivo, verá dos entradas:

  • HISTSIZE:  El número máximo de entradas que puede contener la lista del historial.
  • HISTFILESIZE:  El límite para el número de líneas que puede contener un archivo histórico.

".bashrc" en el editor gedit.

Estos dos valores interactúan de las siguientes formas:

  • Cuando inicia sesión o inicia una sesión de ventana de terminal, la lista del historial se completa desde el .bash_historyarchivo.
  • Cuando cierra una ventana de terminal, el número máximo de comandos configurados HISTSIZE se guarda en el .bash_history archivo.
  • Si la histappendopción de shell está habilitada, los comandos se agregan a .bash_historySi histappendno está configurado, .bash_historyse sobrescribe.
  • Después de guardar los comandos de la lista del historial en .bash_history, el archivo del historial se trunca para contener no más de HISTFILESIZElíneas.

También cerca de la parte superior del archivo, verá una entrada para el HISTCONTROLvalor.

La entrada "HISTCONTROL" en el archivo ".bashrc" en gedit.

Puede establecer este valor para realizar cualquiera de las siguientes acciones:

  • ignorespaces:Las líneas que comienzan con un espacio no se agregan a la lista del historial.
  • ignoredups:Los comandos duplicados no se agregan al archivo de historial.
  • ignoreboth:Habilita ambos de los anteriores.

También puede enumerar comandos específicos que no desea agregar a su lista de historial. Sepárelos con dos puntos (:) y póngalos entre comillas (“…”).

Seguiría esta estructura para agregar una línea a su  .bashrcarchivo y sustituir los comandos que desea que se ignoren:

exportar HISTIGNORE = "ls: history"

Un comando "export HISTIGNORE =" ls: history "en gedit.

Usar marcas de tiempo

Si desea agregar marcas de tiempo a la lista del historial, puede usar la HISTIMEFORMATconfiguración. Para hacerlo, simplemente agregue una línea como la siguiente a su .bashrcarchivo:

exportar HISTTIMEFORMAT = "% c"

Tenga en cuenta que hay un espacio antes de las comillas de cierre. Esto evita que la marca de tiempo coincida con los comandos de la lista de comandos.

Un comando "export HISTTIMEFORMAT ="% c "en gedit.

Ahora, cuando ejecuta el comando history, ve las marcas de fecha y hora. Tenga en cuenta que todos los comandos que estaban en la lista del historial antes de agregar las marcas de tiempo se marcarán con la fecha y la hora del primer comando que recibe una marca de tiempo. En este ejemplo que se muestra a continuación, este fue el comando 118.

Una lista de historial con marcas de tiempo en una ventana de terminal.

Esa es una marca de tiempo muy larga. Sin embargo, puede usar tokens además de  %c para refinarlo. Los otros tokens que puede usar son:

  • %d: Día
  • %m: Mes
  • %y: Año
  • %H:  Hora
  • %M:  Minutos
  • %S: Segundos
  • %F: Fecha completa (formato año-mes-fecha)
  • %T: Hora (formato hora: minutos: segundos)
  • %c: Sello completo de fecha y hora (formatos de día-fecha-mes-año y hora: minutos: segundos)

Experimentemos y usemos algunos tokens diferentes:

exportar HISTTIMEFORMAT = "% dn% m% T"

El comando export HISTTIMEFORMAT = "% dn% m% T" en gedit.

La salida utiliza el día, el mes y la hora.

Una lista de historial con marcas de tiempo en una ventana de terminal.

Sin embargo, si eliminamos el día y el mes, solo mostrará la hora.

Cualquier cambio que realice se HISTIMEFORMATaplicará a toda la lista del historial. Esto es posible porque el tiempo de cada comando se almacena como el  número de segundos de la época de UnixLa HISTTIMEFORMATdirectiva simplemente especifica el formato utilizado para convertir esa cantidad de segundos en un estilo legible por humanos, como:

exportar HISTTIMEFORMAT = "% T"

El comando "export HISTTIMEFORMAT ="% T "en gedit.

Nuestra producción ahora es más manejable.

Una lista de historial con marcas de tiempo en una ventana de terminal.

También puede utilizar el historycomando para auditar. A veces, revisar los  comandos que ha usado en el pasado puede ayudarlo a identificar qué pudo haber causado un problema.

Al igual que en la vida, en Linux, puede usar el  history comando para revivir los buenos tiempos y aprender de los malos.