10 trucos bash que deberías conocer

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?

3 comentarios en “10 trucos bash que deberías conocer

  1. 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.

  2. 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.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *