Cuando usa la línea de comandos de Linux con frecuencia, usar el comando de historial de manera efectiva puede ser un gran aumento de la productividad.
En Linux, hay un comando muy útil para mostrarle todos los últimos comandos que se han utilizado recientemente. El comando simplemente se llama history
.
Mostrar marca de tiempo
Por lo general, cuando escribe history
en la línea de comandos, de manera predeterminada, verá un número seguido de los comandos que ha usado recientemente. Para propósitos de auditoría, puede ser beneficioso mostrar la marca de tiempo junto con el comando como se muestra a continuación.
Para habilitar la marca de tiempo en history
salida del comando, debe configurar el HISTTIMEFORMAT
variable bash.
export HISTTIMEFORMAT="%F %T "
history | more
1 2020-06-25 19:02:39 systemctl restart network
2 2020-06-25 19:02:43 exit
3 2020-06-25 19:02:47 id
4 2020-06-25 19:02:56 cat /etc/hosts
Buscando historial de comandos
Esta puede ser la función que usa con más frecuencia del history
comando . Cuando ya haya ejecutado un comando muy largo, simplemente puede buscar en el historial usando una palabra clave y volver a ejecutar el mismo comando sin tener que escribirlo por completo.
- Presiona
Control+R
y escriba la palabra clave. - Presione enter cuando vea su comando, que ejecutará el comando del historial.
En el siguiente ejemplo, busqué host
, que mostraba el comando anterior cat /etc/hosts
en el historial que contenía la palabra host
.
(reverse-i-search)`host': cat /etc/hosts
cat /etc/hosts
#<ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost server1
::1 localhost.localdomain localhost server1
A veces desea editar un comando del historial antes de ejecutarlo. Por ejemplo, puede buscar systemctl
, que mostrará systemctl restart network
desde el historial de comandos, seleccione este comando (pulsando ESC
clave) y cambiar el restart
para stop
.
Luego vuelva a ejecutarlo presionando Enter
.
(reverse-i-search)`systemctl': systemctl stop network
systemctl stop network
Repetir el último comando ejecutado
En algún momento puede terminar repitiendo los comandos anteriores por varias razones. Las siguientes son las 4 formas diferentes de repetir el último comando ejecutado.
- Use la
up arrow
para ver el comando anterior y presione enter para ejecutarlo. - Escriba
!!
y presione enter desde la línea de comando - Escriba
!-1
y presione enter desde la línea de comando. - Presiona
Control+P
mostrará el comando anterior, presione enter para ejecutarlo.
Ejecutar un comando específico
En el siguiente ejemplo, si quiere repetir el comando #4, puede hacer !4
como se muestra a continuación.
history | more
systemctl restart network
exit
id
cat /etc/hosts
!4
cat /etc/hosts
#<ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost server1
::1 localhost.localdomain localhost server1
Ejecutar comando anterior que comienza con una palabra específica
Escribe !
seguido de las primeras letras del comando que le gustaría volver a ejecutar. En el siguiente ejemplo, escribir !ps
e ingrese, ejecutó el comando anterior comenzando con ps
, que es ps aux | grep yp
.
!ps
ps aux | grep yp
root 16947 0.0 0.1 36516 1264 ? Sl 13:10 0:00 ypbind
root 17503 0.0 0.0 4124 740 pts/0 S+ 19:19 0:00 grep yp
Limitar el número de elementos del historial
Esto está controlado por HISTSIZE
y HISTFILESIZE
Variables de shell Bash incorporadas. Agregue las siguientes dos líneas a su ~/.bashrc
archivo y cierre sesión y luego vuelva a iniciar sesión.
HISTSIZE=1500
HISTFILESIZE=1500
Como resultado, ahora history
está configurado para almacenar 1500 comandos.
Cambiar el nombre del archivo de historial
Por defecto, history
se almacena en ~/.bash_history
archivo.
Agregue la siguiente línea a .bash_profile
archivo y vuelva a iniciar sesión en el shell Bash, para almacenar el comando de historial en .my_commandline
archivo en lugar de .bash_history
archivo.
HISTFILE=/root/.my_commandline
Esto se usa cuando desea realizar un seguimiento de los comandos ejecutados desde diferentes terminales utilizando un nombre de archivo de historial diferente.
Eliminar la continua entrada repetida del historial
En el siguiente ejemplo pwd
se escribió tres veces, cuando haces la historia, puedes ver las 3 ocurrencias continuas de la misma. Para eliminar duplicados, configure HISTCONTROL
a ignoredups
como se muestra a continuación.
history | tail -4
44 pwd
45 pwd
46 pwd
47 history | tail -4
export HISTCONTROL=ignoredups
history | tail -3
56 export HISTCONTROL=ignoredups
57 pwd
58 history | tail -4
Borrar duplicados de todo el historial
Los ignoredups
que se muestra arriba elimina los duplicados solo si son comandos consecutivos. Para eliminar duplicados en todo el historial, configure el HISTCONTROL
a erasedups
como se muestra a continuación.
export HISTCONTROL=erasedups
pwd
systemctl restart network
history | tail -3
38 pwd
39 systemctl restart network
40 history | tail -3
ls -l
systemctl restart network
history | tail -6
35 export HISTCONTROL=erasedups
36 pwd
37 history | tail -3
38 ls -l
39 systemctl restart network
40 history | tail -6
Obligar al historial a no recordar un comando en particular
Cuando ejecuta un comando, puede instruir a history
para ignorar el comando configurando HISTCONTROL
para ignorespace
y escribiendo un espacio delante del comando como se muestra a continuación.
Veo que muchos administradores de sistemas junior se emocionan con esto, ya que pueden ocultar un comando del historial. Es bueno entender cómo ignorespace
obras. Pero, como práctica recomendada, no oculte nada del historial a propósito.
export HISTCONTROL=ignorespace
ls -ltr
pwd
systemctl restart network #Note that there is a space at the beginning of service, to ignore this command from history
history | tail -3
67 ls -l
68 pwd
69 history | tail -3
Borrar todo el historial anterior
En algún momento, es posible que desee borrar todo el history
anterior , pero quiere que la historia siga avanzando.
history -c
Palabras sustitutas de los comandos de historial
Cuando estás buscando a través del history
, es posible que desee ejecutar un comando diferente pero usar el mismo parámetro del comando que acaba de buscar.
En el siguiente ejemplo, el !!:$
al lado del vi
El comando obtiene el argumento del comando anterior al comando actual.
ls nginx.conf
nginx.conf
vi !!:$
vi nginx.conf
En el siguiente ejemplo, el !^
junto al comando vi obtiene el primer argumento del comando anterior (es decir, cp
comando) al comando actual (es decir, vi
comando).
cp nginx.conf nginx.conf.bak
vi !^
vi nginx.conf
Sustituir un argumento específico por un comando específico
En el siguiente ejemplo, !cp:2
busca el comando anterior en el historial que comienza con cp y toma el segundo argumento de cp y lo sustituye por el comando ls -l como se muestra a continuación.
cp ~/longname.txt /really/a/very/long/path/long-filename.txt
ls -l !cp:2
ls -l /really/a/very/long/path/long-filename.txt
En el siguiente ejemplo, !cp:$
busca el comando anterior en el historial que comienza con cp y toma el último argumento (en este caso, que también es el segundo argumento como se muestra arriba) de cp y lo sustituye por el comando ls -l como se muestra a continuación.
ls -l !cp:$
ls -l /really/a/very/long/path/long-filename.txt
Desactivar el uso del historial
Si desea deshabilitar history
todos juntos y no quiere que Bash Shell recuerde los comandos que ha escrito, configure el HISTSIZE
a 0 como se muestra a continuación.
export HISTSIZE=0
Ignorar comandos específicos del historial
A veces, es posible que no desee saturar su historial con comandos básicos como pwd
y ls
. Usa HISTIGNORE
para especificar todos los comandos que desea ignorar del historial.
Tenga en cuenta que agregar ls
al HISTIGNORE
ignora solo ls
y no ls -l
. Por lo tanto, debe proporcionar el comando exacto que le gustaría ignorar del historial.
export HISTIGNORE="pwd:ls:ls -ltr:"
pwd
ls
ls -l
systemctl restart network
history | tail -3
79 export HISTIGNORE="pwd:ls:ls -l:"
80 systemctl restart network
81 history
[Note that history did not record pwd, ls and ls -l]
Para obtener más información sobre la history
comando en Linux, consulte su página de manual.