Etiquetas

, , , , , , , ,

La BASH o Bourne Again SHell es de las shells más utilizada gracias a su uso por defecto en la mayoría de los sistemas GNU/Linux. Por ello, me parece interesante recopilar aquí unos pequeños trucos para conseguir sacar todo el poderío de esta herramienta que usamos la mayoría de nosotros. Hoy comenzaremos con history que nos permite ejecutar comandos que ya ejecutamos en el pasado así como ver una relación de éstos.

Tuneando history

El comando history nos muestra los comandos ejecutados en la última sesión cerrada. Algo que suele suceder es que ejecutes el mismo comando varias veces seguidas. Por ejemplo, un ls esperando a que acabe de descargarse un fichero para ver cuándo aparece ese fichero con su tamaño completo y desaparece el temporal. Para que únicamente quede registrado un ls en el historial, añadiremos la siguiente línea al fichero .bashrc que se encuentra en el directorio home de tu usuario:
echo 'export HISTCONTROL=ignoredups' >> ~/.bashrc
source ~/.bashrc

Por ejemplo, antes de añadir la línea y tras ejecutar dos veces el comando history y después tres veces el comando ls:
501 cd Downloads/
502 history
503 history
504 ls
505 ls
506 ls
507 history

Y tras asignar el valor ignoredups a HISTCONTROL, volvemos a ejecutar varias veces consecutivas history y después ls. El resultado, ésta vez, es el siguiente:
512 history
513 ls
514 history

Otra «torpeza» del history es la falta de la fecha y hora de ejecución de un comando. En un sistema que utilice un único usuario esto puede que no lo eche de menos nunca, pero os aseguro que en un sistema al que entran distintas personas con el mismo usuario es de agradecer. Para añadir dia y hora al history ejecutamos:
echo 'export HISTTIMEFORMAT="%d/%m/%y %T "' >> ~/.bashrc
source ~/.bashrc

Tras ello, y como por arte de magia, veremos así el historial:
512 17/11/12 22:48:48 history
513 17/11/12 22:48:53 ls
514 17/11/12 22:49:04 history

Sacando provecho a history

  • !! con doble admiración ejecutamos el último comando ejecutado con todos sus parámetros:
    xir@quad ~/Downloads/test $ ls -l
    total 0
    xir@quad ~/Downloads/test $ !!
    ls -l
    total 0
  • !n con ! y el identificador en el historial (el número que aparece secuencialmente a la izquierda de los comandos al ejecutar el comando history) ejecutamos el comando correspondiente a ese identificador con todos sus parámetros:
    xir@quad ~/Downloads/test $ history | grep ls | tail -2
    526 17/11/12 22:45:57 ls -l
    528 17/11/12 22:47:53 history | grep ls
    xir@quad ~/Downloads/test $ !526
    ls -l
    total 0
  • !patron donde patron son los primeros caracteres de la última línea ejecutada que quieres que se vuelva a ejecutar.
    Por ejemplo:
    xir@quad ~$ cat /etc/passwd | grep root
    root:x:0:0:root:/root:/bin/bash
    xir@quad ~ $ echo 'El sentido de la vida, el Universo y todas las demás cosas es...'
    El sentido de la vida, el Universo y todas las demás cosas es...
    xir@quad ~ $ !c
    cat /etc/passwd | grep root
    root:x:0:0:root:/root:/bin/bash
    xir@quad ~ $
    Como ves ejecuta la línea al completo, no sólo el primer comando
  • :s/p1/p2/ el patrón p1 por el patrón p2 cuando se utiliza !. Para que sustituya todas las apariciones y no sólo la primera, deberemos utilizar :gs/p1/p2/
    xir@quad ~ $ echo 'www.wikipedia.com'
    www.wikipedia.com
    xir@quad ~ $ !!
    echo 'www.wikipedia.com'
    www.wikipedia.com
    xir@quad ~ $ !!:s/.com/.org/
    echo 'www.wikipedia.org'
    www.wikipedia.org

    xir@quad ~ $ echo 'www.wikipedia.com'
    www.wikipedia.com
    xir@quad ~ $ !e
    echo 'www.wikipedia.com'
    www.wikipedia.com
    xir@quad ~ $ !e:s/.com/.org/
    echo 'www.wikipedia.org'
    www.wikipedia.org

  • Ctrl+R esta combinación de teclas te permite «hacer una búsqueda» en las líneas del historial. Busca en cualquier parte de la línea por lo que si recuerdas que ejecutaste un comando pero no sabes cuál sobre el fichero ejemplo.txt, puedes teclear «ctrl+R ejemplo.txt» y aparecerá la última línea que contenga «ejemplo.txt. Si ese no es el comando que tú querías, volviendo a presionar ctrl+R te va mostrando anteriores ejecuciones. Lo mejor de todo es que con ctrl+R puedes modificar los parámetros antes de ejecutar la línea.
  • Ctrl+P Va al anterior comando del historial pero, a diferencia de !!, no lo ejecuta
  • Ctrl+N Va al siguiente comando del historial (si lo hay)
  • Esc+< Va a la primera línea del historial. Para las opciones con la tecla Esc, la pulsación de las teclas es secuencial y no simultánea. Es decir: presionas Esc, lo sueltas, y presionas la siguiente tecla o combinación de teclas
  • Esc+> Va a la última línea del historial
  • Esc+. Inserta el último argumento del comando anterior en la posición actual del cursor
  • Esc+Ctrl+E Sustituye los alias y variables por sus valores tal como los ejecutará el intérprete de comandos
  • Ctrl+O Acepta la línea actual y obtiene la siguiente. Si nos hemos movido con, por ejemplo, Ctrl+P, con Ctrl+O sería como si presionáramos Intro y posteriormente fuésemos a buscar la siguiente línea que haya a la que acabamos de ejecutar

¿Conoces alguna otra utilidad del historial? ¿Alguna otra combinación de teclas útil para reutilizar comandos? Por favor, comparte tus conocimientos en los comentarios.

EDICION 11/02/2013: actualizado el post con la sugerencia de Miguel Pérez y con la sustitución en patrones