Bash bang commands y más

15 Septiembre 2016 at 11:26 by Adrián Pérez

bash
A continuación una serie de comandos útiles en bash, que (por lo menos a mí) me viene bien tener a mano, razón por la cual seguramente este post se actualice varias veces a medida que vaya añadiéndo comandos útiles a mi día a día.

"$?": Exit code

"$?" Muestra el exit code del comando que se acaba de ejecutar.

[adri@localhost tmp]$ cat test 
#!/bin/bash
exit 0
[adri@localhost tmp]$ ./test 
[adri@localhost tmp]$ echo $?
0
[adri@localhost tmp]$ cat test 
#!/bin/bash
exit 1
[adri@localhost tmp]$ ./test 
[adri@localhost tmp]$ echo $?
1

Ésto se puede usar dentro de scripts en bash, para saber cómo ha acabado la línea anterior del script, lo cual puede resultar muy muy útil.

"-": Path anterior

La variable de entorno "$OLDPWD" tiene la referencia al path anterior al actual (es decir, al directorio al que estábamos justo antes de cambiar al directorio actual).

[adri@adri ~]$ env | grep -i oldpwd
OLDPWD=/etc

Actualmente, se le suele pasar, símplemente el parámetro "-" al comando "cd", lo cual es equivalente a hacer "cd "$OLDPWD" && pwd" [Fuente]

[adri@adri ~]$ cd -
/etc

Además de lo anterior, contamos con una serie de comandos llamados "bash bang (!) commands" (los cuales empiezan por "!") que sirven para ejecutar un comando que hemos ejecutado préviamente. A continuación los que me parecen más útiles:

"!!": Comando anterior

"!!" copiará el comando entero que acabamos de ejecutar. Muy útil para cuando olvidamos el "sudo"

[adri@localhost tmp]$ mv myfile /usr/local/bin
mv: cannot move 'file' to `/usr/local/bin/myfile´: Permission denied
[adri@localhost tmp]$ sudo !!
[adri@localhost tmp]$

"!$": Último parámetro anterior

Similar al anterior punto, pero únicamente se refiere al último parámetro de la ejecución anterior.

[adri@localhost ~]$ ls -lad /tmp/
drwxrwxrwt 13 root root 280 Sep 13 13:35 /tmp/
[adri@adri ~]$ cd !$
cd /tmp/
[adri@adri tmp]

"!texto": Último comando "texto" ejecutado

Con "!texto" estaremos ejecutando la última ejecución que empieza con "texto". "texto" no tiene por qué ser el nombre del comando ejecutado, puede ser un prefijo, pues basta con que los primeros carácteres coincidan.

[adri@localhost data]$ wacth 'ls -la'
[...]
# Múltiples ejecuciones de otros comandos, ninguno de los cuales empieza por "wat"
[adri@localhost data]$ !wat 
# Ejecutará "watch 'ls -la'"

":p": Muestra el comando a ejecutar

Si bien ":p" no es un "bang command", es muy útil para usarse junto al comando anterior ("!texto"), pues de esta manera, se printará el comando que "!texto" ejecutaría, sin ejecutarlo en realidad. Así pues, si tienes dudas del comando que se te ejecutará con "!texto", prueba a ponerle el ":p" para mostrar el comando a ejecutar y estar así seguro de que vas a hacer lo que quieres hacer. Como extra, este comando meterá en el history el comando que se hubiera ejecutado, aun cuando no se haya ejecutado, ideal para usar después el "!!".

# Verificamos el comando sin ejecutarlo
[adri@adri data]$ !sftp:p
sftp adri@1.2.3.4
# Lo ejecutamos
[adri@adri data]$ !!
sftp adri@1.2.3.4
Connected to 1.2.3.4
sftp>

¡Mucha más información interesante en los enlaces del final!

Fuentes:
http://www.skorks.com/2009/09/bash-shortcuts-for-maximum-productivity/
http://ss64.com/bash/bang.html
http://samrowe.com/wordpress/advancing-in-the-bash-shell/