Utilizar el bash history a fondo

Debo reconocer que el uso que yo le daba al history no iba más allá del uso de las flechas arriba y abajo para navegar por los últimos comandos, o como alguna vez vimos: el Top 5 de los comandos más utilizados o  como utilizar el operador !! (bang bang).

En esta ocasión, veremos unos cuantos ejemplos de algo del provecho que le podemos sacar a esta herramienta:

  • Mostrar el timestamp del comando: normalmente cuando ejecutas history ves el número del comando y el comando propiamente dicho. Para propósitos de auditoría también te puede ser útil ver fecha y hora de cuando se ejecutó el comando. Para hacer esto, hay que setear la variable de entorno HISTTIMEFORMAT.


# export HISTTIMEFORMAT=’%F %T ‘
# history | more
1  2008-08-19 20:01:01 service network restart
2  2008-08-19 20:02:09 exit
3  2008-08-19 20:08:39 id
4  2008-08-19 20:11:23 cat /etc/inetd.conf

  • Búsqueda en el history: presionando Ctrl+R puedes buscar en tu history por un comando. Una vez presionado Ctrl+R en el prompt, empiezas a copiar el comando y el shell buscará por un comando que coincida en parte con lo que estás ingresando. Una vez que de con el comando que buscas puedes presionar Enter para confirmarlo o las flechas izquierda o derecha para editar el comando antes de ejecutarlo.


# (reverse-i-search)`inet‘: cat /etc/inetd.conf

  • Repetir el último comando: puedes repetir el último comando de cuatro formas diferentes: presionando la flecha hacia arriba y Enter, ingresando el operador !! (bang bang) y Enter, ingresando !-1 y Enter o presionando Ctrl+P y Enter.
  • Ejecutar un comando específico del history: para ejecutar un comando específico del history, debes conocer el número del mismo y luego anteceder al número del mismo el operador !


# history | more
1  service network restart
2  exit
3  cat /etc/services

# !3
cat /etc/services

  • Ejecutar un comando previo que empieza con una palabra específica: ingresando ! seguido de unas cuantas letras, ejecutarás nuevamente un comando, que empiece con esas letras, previamente ejecutado.


# !ps
ps ax | grep cron
5023 ?        Ss    0:00    /usr/sbin/cron
8057 pts/0    R+    0:00    grep cron

  • Controlar la cantidad total de líneas en el history: seteando la variable de entorno HISTSIZE, en el .bash_profile por ejemplo, podrás limitar la cantidad de líneas almacenadas por el history.


# nano ~/.bash_profile
HISTSIZE=450
HISTFILESIZE=450

  • Cambiar el nombre del archivo history: por default, el history del bash se almacena en el archivo ~/.bash_history, para cambiar el nombre del mismo, debemos setear la variable de entorno HISTFILE:


# nano ~/.bash_profile
HISTFILE=$HOME/.historia

  • Eliminar las entradas contiguas repetidas: seteando la variable de entorno HISTCONTROL se pueden eliminar las entradas contiguas repetidas, mira el ejemplo:


# ls
# ls
# ls
# history | tail -4
353  ls
354  ls
355  ls
356  history | tail -4
#
# export HISTCONTROL=ignoredups
# ls
# ls
# ls
# history | tail -3
357  export HISTCONTROL=ignoredups
358  ls
359  history | tail -3

  • Borrar duplicados a lo largo del history: el valor ignoredups de la variable de entorno HISTCONTROL utilizado anteriormente solo borra entradas duplicadas consecutivas, para eliminar entradas duplicadas en todo el archivo hay que setear HISTCONTROL=erasedups
  • Forzar a que el history no recuerde un comando en particular: seteando la variable HISTCONTROL con el valor ignorespace, puedes hacer que el history no recuerde un comando en particular si al mismo le dejas un espacio en blanco delante.


# export HISTCONTROL=ignorespace
# ls -l
# pwd
#  service httpd stop
# history | tail -3
567  ls -ltr
568  pwd
569  history | tail -3

  • Limpiar todas las entradas previas del history: ejecutando history -c eliminarás para la consola activa todas las entradas previas al history, pero no estarás eliminándolas del bash_history, por lo tanto en una nueva consola conservarás el history.
  • Sustituir palabras de los comandos del history: a veces puede ser que necesites ejecutar otro comando, pero con el mismo argumento que el comando anterior. En el siguiente ejemplo, el !!:$ a continuación del comando nano obtiene el argumento del comando anterior:


# ls .bash_logout
.bash_logout
# vi !!:$
vi .bash_logout

En este otro ejemplo, el !^ a continuación del comando nano obtiene el primer argumento del comando anterior:

# cp .bash_logout .bash_logout.old
# vi !^
vi .bash_logout

  • Sustituir un argumento específico de un comando específico: en el siguiente ejemplo, !cp:2 busca por el comando anterior que empieza con cp y toma el segundo argumento y lo sustituye para el comando cat que se ejecuta a continuación:


# cp .bash_logout .bash_logout.old
# cat !cp:2
cat .bash_logout.old

  • Deshabilitar el uso del history: si quieres deshabilitar el history y que el bash shell no recuerde más los comandos ingresados, debes setear la variable HISTSIZE en 0


# export HISTSIZE=0
# history
# #nota aquí que no se muestra nada

  • Ignorar comandos específicos: muchas veces pueded no querer agregar al history comandos usuales como pwd, ls, etc. Para ignorar comandos debemos setear la variable HISTIGNORE (no sería mala idea hacerlo desde el ~/.bash_profile) de la siguiente manera:


# export HISTIGNORE=”pwd:ls:ls -ltr:”

Vía: The Geek Stuff

2 comentario en este artículoDeje el suyo
  1. saludos, muy interesante y claro tu entrada, continua con estos aportes

  2. saludos, util entrada, ojala compartas mas de esta clase de info.

Deje su comentario

Por favor, ingrese su nombre

Por favor, ingrese un correo-e válido

Por favor, ingrese su mensaje

luauf.com 2012

WordPress