10 trucos bash que deberías conocer
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:
[email protected]:~$ cd /usr/local/
[email protected]:/usr/local$ cd /tmp
[email protected]:/tmp$ cd -
/usr/local
[email protected]:/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:
[email protected]:/usr/local$ echo "foo"
foo
[email protected]:/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:
[email protected]:~$ touch 4.txt
[email protected]:~$ 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" [email protected]/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" [email protected]
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:
[email protected]:~$ bind -p
"C-g": abort
"C-xC-g": abort
"eC-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-xC-?": backward-kill-line
"eC-h": backward-kill-word
"eC-?": backward-kill-word
"ee[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”:
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
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:
[email protected]:~$ cd /usr/local/
[email protected]:/usr/local$ cd /tmp
[email protected]:/tmp$ cd -
/usr/local
[email protected]:/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:
[email protected]:/usr/local$ echo "foo"
foo
[email protected]:/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:
[email protected]:~$ touch 4.txt
[email protected]:~$ 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" [email protected]/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" [email protected]
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:
[email protected]:~$ bind -p
"C-g": abort
"C-xC-g": abort
"eC-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-xC-?": backward-kill-line
"eC-h": backward-kill-word
"eC-?": backward-kill-word
"ee[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