miércoles, 27 de noviembre de 2013

Tuberías y concatenación de comandos

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

Esta entrada está estrechamente relacionada con la última publicada en este blog. Si con la redirección de comandos empezamos a tomar contacto con una forma de introducir órdenes en la terminal de forma que no se tratara de simplemente de teclear el comando, con las tuberías y las concatenaciones aumentaremos las prestaciones de nuestra shell hasta límites que solo nuestra imaginación podrá establecer.

Pipes o tuberías

Describir las pipes o tuberías es sencillo: se trata de utilizar la salida de un comando (su resultado) como entrada de otro. Hablando en términos matemáticos, 3 + 4 - 5 x 8 sería como una tubería; el resultado de 3 + 4 es el primer operando (la entrada) de la siguiente operación, y su resultado el primer operando la de la siguiente operación.

Para construir una tubería utilizamos en carácter | (Alt Gr + 1) y lo colocamos entre la sucesión de comandos que queremos ejecutar. Para trabajar con tuberías es muy frecuente emplear el comando tee.

tee
Sirve para enviar la entrada del teclado a la pantalla y a uno o más ficheros.
tee -a: inserta los datos al final del archivo.
Veamos algunos ejemplos:
cat grupos001.txt | tee grupos002.txt
De esta forma hemos listado el contenido del fichero grupos001.txt con el comando cat y la salida de dicho comando la hemos enviado, mediante una tubería, al comando tee, el cual nos muestra en pantalla ese contenido y, al mismo tiempo, nos lo inserta en el archivo grupos002.txt que, si no existe, será creado. Sería otra manera de duplicar un archivo, pero es solo un ejemplo de uso.
cat puesto01.txt 2>&1 | tee puesto02.txt
Lo que hemos hecho ahora es listar el archivo puesto01.txt, enviar el error estándar a la pantalla y enviar la salida del comando cat al comando tee, tubería mediante, para crear puesto02.txt.
cat archivo1 2>&1 | tee -a archivo2
Este tercer ejemplo es igual que el anterior pero al incluir el modificador -a al comando tee lo que hacemos en añadir los datos listados de archivo1 en archivo2 si este ya existiera.

Son ejemplos muy simples pero sirven para observar el potencial que pueden tener varias tuberías consecutivas a la hora de simplificar operaciones en el terminal de comandos.

Concatenación de comandos

La concatenación funciona de manera similar a las tuberías pero con una salvedad: en esta ocasión hablamos de comandos ejecutados consecutivamente, uno tras otro y en la misma línea, pero independientes entre sí. Se pueden separar de dos formas obteniendo dos diferentes resultados:
Ejemplo 1: cd /etc ; ls -l
Aquí, los comandos cd /etc y ls -l están separados por el carácter ; lo que significa que aunque el primero de un error el siguiente se ejecuta de todas formas, y así sucesivamente en caso de haber más.
Ejemplo 2: cd /etc && ls -l
En cambio, si están separados por && al primer error la secuencia de comandos se detiene, sea la concatenación tan larga como sea.

Un ejemplo clásico de concatenación es teclear en el terminal la siguiente línea:
sudo apt-get update ; sudo apt-get upgrade
Suele ocurrir que cuando queremos actualizar repositorios y sistema con estos dos comandos el primero se toma su tiempo antes de que podamos ejecutar el segundo, lo que nos lleva a estar pendiente del monitor pasa saber cuando introducir la segunda orden. De este modo actualizaremos nuestros repositorios con apt-get update y nuestra distribución con apt-get upgrade de una sola vez. Es como dejar programadas varias tareas para que se vayan realizando una detrás de la otra hasta quedar todas acabadas.

Y como hemos hablado de pipes escuchemos a la que fue banda de Pepper Keenan, Corrosion Of Conformity, en el vídeoclip de "Albatross".