bash-cli-raspberry-pi

Funciones avanzadas del CLI Bash en Raspberry Pi / Linux

En la entrada anterior presentamos la consola de comandos de Linux y, más concretamente, el CLI Bash como una herramienta potente a la que tenemos que perder el miedo a la hora de usar un sistema basado en Linux como Raspberry Pi.

Dejamos en el tintero algunos aspectos más avanzados de la consola de comandos. En esta entrada vamos a profundizar en algunos de estos conceptos avanzados de Bash y del terminal que nos permitirán ser más eficientes al ejecutar comandos en Linux en nuestras Raspbery PI.

Ejecución secuencial de comandos

En Bash es posible ejecutar varios comandos en una única línea. Así, si queremos ejecutar el comando1 y después el comando2, independientemente del resultado de comando1, podemos usar el separador ’;’

command1 ; command2

También es posible la ejecución condicional de secuencias de comandos, donde la ejecución depende del resultado del comando anterior.

Así, para ejecutar un comando sólo si el comando anterior ha tenido éxito, usamos el separador ’&&’

command1 &&  command2

Si por el contrario queremos ejecutar un comando sólo si el comando anterior ha fallado, usamos el separador ’||’

command1 ||  command2

A modo de ejemplo, para lanzar una espera de 5 segundos y, a continuación, lanzar el editor de texto ‘nano’ abriendo el fichero ‘hola.txt’ ejecutamos la siguiente instrucción:

sleep 5 && nano hola.txt

Usando el historial de Bash

Ya vimos en la entrada anterior que podemos desplazarnos entre los comandos introducidos con anterioridad usando las teclas “arriba” y “abajo” del teclado de flechas.

También podemos usar la búsqueda inversa pulsando las teclas ‘Control + R’. Al escribir las primeras letras de un comando que hayamos escrito con anterioridad, Bash busca entre los comandos y encuentra el comando que empieza por las letras que hemos escrito.

Una vez localizado, podemos pulsar enter para ejecutar el comando, o tabulación para dejarlo como comando actual.

Por otro lado, si queremos repetir el último comando usado podemos escribir

!!

Por ejemplo, es muy útil si hemos escrito un comando y nos hemos olvidado de usar sudo. Podemos repetir la orden escribiendo:

sudo !!

Finalmente, también es posible hacer referencia a uno o varios argumentos escritos en el último comando.

!*  #El comando anterior sin la última palabra
!$  #La última palabra del comando anterior
$*  #Todos los parámetros del comando anterior
$@  #Todos los parámetros del comando anterior como vector

Por ejemplo, podemos crear un directorio y después acceder a él escribiendo:

mkdir nombreDeDirectorioMuyLargo
cd $*

Un comportamiento similar puede obtenerse con la combinación de teclas ‘Alt + .,’ que nos muestra de forma cíclica los últimos argumentos introducidos.

Usando WildCards

Es posible usar el símbolo ’*’ como wildcard, es decir, un alias que significa “cualquier cosa”.

Por ejemplo, si tenemos un fichero que se llama ‘nombreDeFicheroRealmenteLargo’ y queremos aplicar un comando podemos emplear

comando nombre*Largo

Ejecutaremos comando en todos los ficheros que empiezan por nombre y terminen por largo, dentro del directorio actual.

Un uso muy habitual es borrar (o copiar, o cualquier otro comando) todos los ficheros que tengan una extensión. Por ejemplo, para borrar todos los ficheros con extensión ‘txt’ ejecutaríamos:

rm *.txt

Redirecciones en Bash

Otro aspecto interesante de es la posibilidad de realizar redirecciones, es decir, hacer que la salida o la entrada de un comando tenga un origen distinto a la consola de comandos. Los destinos/orígenes más habituales son ficheros de texto (aunque existen otros).

Así, una dirección de salida, en la que el resultado de un comando en lugar de mostrarse en la pantalla se enviaría a “destino”, quedaría así:

comando > destino

Y una redirección de entrada, en la que el comando en lugar de usar el teclado emplearía “origen” como entrada

comando2 < origen

Por ejemplo, si queremos guardar el resultado de un comando en un fichero de texto usamos una redirección de salida. Para ello empleamos el carácter ’>’ si queremos reemplazar el contenido del fichero, o ’>>’ si queremos añadir el contenido manteniendo el original.

Así, si queremos guardar el listado de ficheros y carpetas de un directorio en un fichero “output.txt” podríamos ejecutar la siguiente instrucción:

ls > output.txt

Si, continuando con el ejemplo, queremos contar el número de líneas del fichero “output.txt” podemos usar una redirección de entrada con la siguiente instrucción:

wc < output.txt

Tuberías (pipes)

Las tuberías permiten enviar el resultado de un comando como entrada a otro comando. Es similar a combinar una redirección de salida y una redirección de entrada. Para ello se emplea el carácter ’|‘.

Por ejemplo, el siguiente ejemplo lista todos los ficheros de una carpeta con el comando ‘ls’ y después busca en el resultado las líneas que contienen la palabra ‘word’ con el comando ‘grep’.

ls | grep Word

Múltiples intérpretes de comandos

En la mayoría de distribuciones es posible ejecutar varios intérpretes de comandos independientes y simultáneos, aparte de los que podamos lanzar como ventanas dentro del entorno gráfico.

raspberry-pi-bash-multiple-terminales

Así, podemos pulsar la combinación de teclado Control ‘Ctrl + Alt + F1’ … F6, para lanzar hasta 6 terminales independientes del entorno gráfico.

En caso de tener varias terminales abiertas, podemos ejecutar el siguiente comando para saber en qué terminal nos encontramos.

Tty

Por su parte, el atajo de teclado ‘Ctrl + d’ cierra la sesión de terminal actual. Por último, la combinación ‘Ctrl + Alt + F7’ nos devolverá al entorno gráfico, si estábamos usando alguno.

Ejecutar procesos en paralelo

También es posible ejecutar varios procesos en paralelo desde una única consola de comandos. Para ejecutar un comando y mandarlo a segundo plano empleamos el carácter ’&’

Por ejemplo, si queremos lanzar chromium pero no esperar a que se cierre para seguir ejecutando comandos, podemos lanzarlo en segundo plano con:

chromium &

raspberry-pi-bash-background-process

Por otro lado, el atajo de teclado ‘Ctrl + z’ envía el proceso actual a segundo plano.

Para ver los procesos que tenemos ejecutándose en segundo plano ejecutamos el comando

bg

Y para recuperar el último proceso que hemos puesto en segundo plano empleamos el comando

fg

Hasta aquí la entrada para convertiros en usuarios expertos de Bash y terminar de perderle el miedo del todo. Aún quedan muchas más cosas por explicar, pero las iremos descubriendo poco a poco. Emplearemos la consola de comando frecuentemente en los tutoriales de Raspberry Pi y Linux. Así que ya sabéis. ¡A profundizar en Bash!