Ser rápido y eficiente en la línea de comandos es esencial para el trabajo diario de un administrador de sistemas. Cada uno tenemos nuestros trucos y atajos en las distintas shells disponibles (bash, ksh…). La shell más utilizada actualmente es bash así que os dejo 10 trucos que utilizo mucho en el día a día y que ahorran bastante tiempo. Sois libres de comentar vuestros consejos, atajos y trucos de bash ;)
Acceso directo a nuestra home
Hay muchas formas de acceder directamente a nuestro directorio «home» de usuario, la más rápida es simplemente el comando «cd» sin parámetros:
$ cd
Otras formas de hacerlo:
$ cd ~
$ cd ~/
Volver atrás (directorio)
Este truco bash lo utilizo muchísimo. Permite volver al directorio en el que nos encontrábamos anteriormente:
cd -
Ejemplo:
alex@foo:~$ cd /usr/local/ alex@foo:/usr/local$ cd /tmp alex@foo:/tmp$ cd - /usr/local alex@foo:/usr/local$
Repetir el anterior comando ejecutado
Muy útil también, podemos querer repetir el comando ejecutado anteriormente o ejecutarlo con ciertas modificaciones de parámetros, añadir pipes, etc. El comando anterior en bash siempre puede ser repetido ejecutando doble admiración:
$ !!
Ejemplo:
alex@foo:/usr/local$ echo "foo" foo alex@foo:/usr/local$ !! "bar" echo "foo" "bar" foo bar
O lo típico que nos olvidamos de poner sudo:
$ apt-get install foo $ sudo !!
Ejecutar un comando con los argumentos del anterior
Muy similar al truco anterior, en este caso hacemos uso de la variable «!$», que contiene todos los argumentos del comando anterior:
alex@foo:~$ touch 4.txt alex@foo:~$ ls -ltrh !$ ls -ltrh 4 -rw-r--r-- 1 alex alex 0 2014-09-12 14:57 4.txt
Búsqueda en el history
Sin duda el comando más utilizado por la mayoría de sysadmins, es un «acceso rápido» a todas las ejecuciones almacenadas en nuestro histórico de bash «~/.bash_history«. Permite encontrar rápidamente comandos ejecutados con anterioridad. La combinación de teclas para activar la búsqueda es CTRL + r (^R). Aparecerá un «buscador en el que conforme escribamos aparecerán las coincidencias del histórico.
(reverse-i-search)`':
Ejemplo:
Quiero volver a ejecutar un comando enorme que ejecuté hace unos días que tenía un awk, es el siguiente:
cat test.txt | awk '{print $1 $3 $4}' | cut -d "a" -f 2 | sort -n | uniq -c | mail -s "ahí va este correo" foo@bar.com/pre>
En este caso, puedo encontrarlo de varias formas, pero la más óptima es usar una «keyword» que sepamos que está sólo en este comando, por ejemplo awk. Sólo escribo «a» ó «aw» ó «awk» y ya sale el comando para ejecutarlo o modificarlo:
(reverse-i-search)`awk': cat test.txt | awk '{print $1 $3 $4}' | cut -d "a" -f 2 | sort -n | uniq -c | mail -s "ahí va este correo" foo@bar.com
Cuando sale puedes editarlo, ejecutarlo o lo que quieras. Si esa no es la coincidencia que buscas, simplemente vuelve a teclear CTRL + r (^R) y pasará a la siguiente, y así sucesivamente.
Listar todos los shortcuts definidos
Es imposible acordarse de todos los shortcuts definidos en el sistema. El comando «bind -p» nos muestra el listado:
alex@foo:~$ bind -p "\C-g": abort "\C-x\C-g": abort "\e\C-g": abort "\C-j": accept-line "\C-m": accept-line # alias-expand-line (not bound) # arrow-key-prefix (not bound) # backward-byte (not bound) "\C-b": backward-char "\eOD": backward-char "\e[D": backward-char "\C-h": backward-delete-char "\C-?": backward-delete-char "\C-x\C-?": backward-kill-line "\e\C-h": backward-kill-word "\e\C-?": backward-kill-word "\e\e[D": backward-word "\e[1;5D": backward-word "\e[5D": backward-word "\eb": backward-word "\e<": beginning-of-history "\C-a": beginning-of-line "\eOH": beginning-of-line "\e[1~": beginning-of-line "\e[H": beginning-of-line "\C-xe": call-last-kbd-macro [...]
Renombrar o copiar archivos
Normalmente, a la hora de hacer una copia a modo de backup de un archivo, cambiar su extensión, nombre o moverlo, lo hacemos del siguiente modo:
$ cp /home/alex/foo.txt /home/alex/foo.txt.bak
Podemos hacerlo mucho más rápido del siguiente modo:
$ cp /home/alex/foo.txt{,.bak}
Y el resultado:
$ ls -l /home/alex/foo.txt* -rw-r--r-- 1 alex alex 0 2014-09-12 18:28 /home/alex/foo.txt -rw-r--r-- 1 alex alex 0 2014-09-12 18:31 /home/alex/foo.txt.bak
Para mover, sería lo mismo:
$ mv /home/alex/foo.txt{,.bak}
$ ls -l /home/alex/foo.txt* -rw-r--r-- 1 alex alex 0 2014-09-12 18:31 /home/alex/foo.txt.bak
Shortcuts de edición de comandos
Movernos rápido es muy importante, estos son los «shortcuts más importantes para ser veloces en la «command line»:
- Ctrl + u: cortar todo el contenido que está antes del cursor y llevarlo al portapapeles de la shell
- Ctrl + k: cortar todo el contenido que está después del cursor y llevarlo al portapapeles de la shell
- Ctrl + y: pegar el contenido de los dos comandos anteriores (el portapapeles de Ctrl + u y Ctrl + k)
- Ctrl + a: volver al comienzo de la línea
- Ctrl + e: ir al final de la línea
- Ctrl + w: borrar la palabra que hay antes del cursor
- Ctrl + l: igual que un «clear», limpia la pantalla.
Alias
Si hay comandos que ejecutas asiduamente y son largos o complicados de escribir/recordar, añádelos como alias en el archivo .bashrc de tu home:
cat ~/.bashrc # Alias definitions. # You may want to put all your additions into a separate file like # ~/.bash_aliases, instead of adding them here directly. # See /usr/share/doc/bash-doc/examples in the bash-doc package. alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
En el archivo anterior vemos el alias «alert». Al ejecutar en la shell bash «alert» se ejecutará el comando enorme del alias:
$ alert
Si queremos ejecutar un comando que tiene un alias pero sin que la ejecución haga referencia al alias le añadimos una contrabarra:
Si por ejemplo tenemos un alias «ls» para «ls -ltrh», si queremos evitar que se ejecute el alias:
$ \ls
Ayuda
Más que un truco, todos deberíamos saber utilizar la ayuda integrada que hay para todos los comandos y funciones de la línea de comandos, el maravilloso comando «man»
$ man <comando>
Hice un artículo sobre el comando «man» un poco más extenso así que os insto a que lo leáis: formas de encontrar ayuda en Linux, BSD y Unix
De momento estos son los trucos que se me han ocurrido, si navegáis por el blog o usáis el buscador encontraréis muchos más, y algunos de estos un poquito mejor explicados.
¿Cuáles son los vuestros?
Hola,
muchas gracias por el artículo, simpre aprendo cosas interesantes y útiles.
En esta ocasión escribo para ampliar un poco, donde usas:
$ !!
se pude poner el penultimo comando de la forma:
$ !-2
y el antepenúltimo:
$ !-3
…
Con los argumentos en verdad «!$» solo cogue el último de ellos, en el ejemplo que pones como solo es 1 son todos los argumentos, pero el comando real para cogerlos todos es «!*», y se puede usar el último comando o los anteriores de la misma forma que acabo de poner arriba. ejemplo:
$ echo a b c
a b c
$ touch !$
touch c
$ touch !-2*
touch a b c
$ chmod 664 !$
chmod 664 c
Muchas gracias por el post y por el blog en general.
Otra cosa que es muy importante, en estos comandos, si lo que queremos hacer es visualizar y no ejecutar debemos añadir «:p» para asegurarnos que lo que vamos a ejecutar es lo que queremos:
$ touch a b c
$ rm !*:p
rm a b c
—> no ha borrado nada, solo ha sacado por pantalla el comando.
$ !!
rm a b c
Si es correcto le podemos decir que haga el último comando y esta vez si lo ejecuta.
¡Genial Miguel!
Muchas gracias por la aportación