
Sin duda una de las herramientas más útiles, características e indispensables de cualquier shell de sistemas tipo Unix (Linux incluido of course), son las llamadas tuberías o pipes. Las tuberías (representadas con el carácter ASCII |)se emplean para interconectar procesos, siendo su uso más habitual el pasar el resultado de la ejecución de un comando a la entrada de otro. Un ejemplo habitual sería:
ps -ef | grep wine.exe
En este comando estamo ejecutando ps con las opciones e y f, con lo que obtenemos un listado completo de procesos con nombre de usuario, PID, y el comando completo que ha lanzado el proceso, entre otras cosas. Toda esa información, en lugar de mostrarla por salida estándar, se la pasamos como entrada mediante una pipe a grep, al que le indicamos que tome dicha entrada, filtre aquellas líneas que contienen la cadena “wine.exe”, y nos las muestre por salida estándar. Con esto localizaríamos todos los procesos que contengan dicha cadena, lo cual a efectos de administración es algo muy cómodo.
En principio conocemos a los pipes como pipes o tuberías, pero sería mas correcto conocerlos como pipes anonimos, puesto que existe otro tipo de tuberías con similares características pero diferente finalidad y uso llamadas Named Pipes (Tuberías con Nombre).
Las Named Pipes son, basicamente, un fichero en disco. La diferencia consiste en que en lugar de ser un contenedor de datos, los Named Pipes actúan como torrentes de caracteres (stream), por lo que se puede indicar a otro o a otros procesos que lo lean y capturen al vuelo la información que contiene.
Ya tenemos las dos primeras diferencias entre una pipe y un Named Pipe: De un Named Pipe pueden leer varios procesos al mismo tiempo, cada uno de ellos puede extraer la información que necesita y procesarla sin tener que esperar turno. Otra característica importante es que los Named Pipes no almacenan datos, por lo que una vez terminado su uso simplemente vuelven a tamaño cero.
Pero, ¿para que podemos usar un Named Pipe? Supongamos que tenemos un script de Perl que lee de varios ficheros de log del sistema y genera un reporte. Dicho reporte es muy largo y el fichero generado es muy pesado, por lo que queremos comprimirlo en un tar.gz para enviarlo por email. Dado que tar y gzip no leen por entrada estándar, es necesario especificarles un fichero, por lo que el proceso normal consistiría en ejecutar el script de Perl, escribir el fichero, y después generar el tar.gz.
Sin embargo, si utilizamos una Named Pipe, podemos hacer que el script vuelque su salida en un Named Pipe y mientras tanto tar vaya leyendo el Named Pipe y comprimiendo. El resultado será únicamente el fichero comprimido, pues el tamaño de la tubería seguirá siendo 0. Útil si tienes el espacio en disco ajustado y quieres ahorrarte un tiempecito.
¿Como se usa una Named Pipe?
Lo primero es crearla, para ello utilizamos el comando mkfifo:
$ mkfifo /tubería
Acto seguido la tendremos disponible para realizar cualquier operación utilizando redirecciones:
ls -lrt > /tuberia
De cara a un script, sería más sencillo introducirla en una variable:
mituberia = /tuberia
mkfifo $mituberia
ls -lrt > $tuberia.
Las Named Pipes no son ni de lejos las más utilizadas en Bash Script. De hecho, no es habitual verlas puesto que en la mayoría de los casos es más sencillo utilizar tuberías anónimas. En cualquier caso, es muy interesante saber de su existencia porque en determinados contextos pueden sernos de gran utilidad.











