Los sistemas Linux admiten tuberías que permiten pasar la salida de un comando a otro, pero también admiten "tuberías con nombre", que son bastante diferentes.
La mayoría de las personas que pasan tiempo en la línea de comandos de Linux se mueven rápidamente en el uso de tuberías. De hecho, las tuberías fueron una de las cosas que realmente me entusiasmaron cuando usé por primera vez la línea de comandos en un sistema Unix. Mi aprecio por su poder y conveniencia continúa incluso después de décadas de usar Linux. Usando tuberías, descubrí todo lo que podía hacer enviando la salida de un comando a otro comando, y a veces a un comando después de ese, para adaptar aún más la salida que estaba buscando.
Puede leer también | Dirty Pipeline : también es conocido por CVE-2022-0847
Los comandos que incorporan tuberías - como el que se muestra a continuación - me permitieron extraer sólo la información que necesitaba sin tener que compilar un programa o preparar un script.
$ cat myposts | grep Linux | wc -l 1456
El comando anterior enviaría el contenido de un archivo llamado "myposts" a un comando grep buscando la palabra "Linux" y luego enviaría esa salida a un comando wc para contar el número de líneas en la salida.
Como probablemente sospeches, las tuberías se llaman "pipes" en gran parte por su parecido con la función de los conductos. Puede que las veas referidas como "tuberías sin nombre" o "tuberías anónimas" porque no son el único tipo de tuberías que Linux proporciona. Hablaremos de ello en breve.
Puede leer también | PipeWire 0.3.46 : lanza correcciones de errores críticos y más
De hecho, las tuberías son tan útiles que a menudo convierto algunos de los comandos que las incorporan en alias para facilitar aún más su ejecución. Por ejemplo, el comando que se muestra a continuación que enumera todos los procesos asociados con la cuenta de inicio de sesión actual podría añadirse al archivo .bashrc del usuario con una línea como esta:
$ echo 'alias myprocs="ps -ef | grep `whoami`"' >> ~/.bashrc $ tail -1 ~/.bashrc alias myprocs="ps -ef | grep `whoami`"
Una vez que hayas enviado tu archivo .bashrc a , el alias estará listo para usarse.
$ myprocs root 3219 738 0 12:15 ? 00:00:00 sshd: shs [priv] shs 3229 1 4 12:15 ? 00:00:00 /usr/lib/systemd/systemd --user shs 3245 3229 0 12:15 ? 00:00:00 (sd-pam) shs 3269 3219 0 12:15 ? 00:00:00 sshd: shs@pts/0 shs 3284 3269 0 12:15 pts/0 00:00:00 -bash shs 3319 3284 0 12:15 pts/0 00:00:00 ps -ef shs 3320 3284 0 12:15 pts/0 00:00:00 grep --color=auto shs
Para ver sólo los IDs de los procesos, puedes configurar un alias como éste:
$ alias myps=”ps aux | grep ^`whoami` | awk '{print \$2}'”
Tenga en cuenta que sólo busca el nombre de usuario en el primer campo (indicado por el ^ para marcar el comienzo de las líneas y muestra el segundo campo. El \ asegura que $2 no se interpreta hasta que el alias es el uso.
Puede leer también | Fedora 35 : Lanzado con GNOME 41 y mejoras para PipeWiere y LUKS
Las tuberías que se utilizan para establecer un flujo de datos que permite a los comandos pasar su salida a otros comandos no es, sin embargo, el único tipo de tubería disponible en los sistemas Linux. En los sistemas Linux, en realidad hay dos formas bastante diferentes de tuberías - las que se muestran arriba y otra forma de tuberías que se llaman "tuberías con nombre".
Tuberías con nombre
A diferencia de las tuberías sin nombre, las tuberías con nombre son bastante diferentes, ya que pueden enviar datos en cualquier dirección. Los comandos pueden enviar datos a las tuberías con nombre y los comandos pueden leer ese contenido. Además, el contenido de las tuberías con nombre no reside en el sistema de archivos, sino sólo en la memoria virtual.
Puede leer también | El futuro del sonido y la captura de pantalla con PipeWire
Permiten que los procesos se comuniquen entre sí. Se configuran como archivos especiales en el sistema de archivos (indicado por el primer carácter en un listado largo que es una "p". Otros permisos indican quién puede leer o escribir en la tubería.
He aquí un ejemplo de creación de una tubería con nombre con el comando mkfifo:
$ mkfifo mypipe $ ls -l mypipe prw-r--r--. 1 justme justme 0 Aug 8 13:55 mypipe
Observe la "p" inicial en el listado mostrado arriba que indica que el archivo es una tubería con nombre y el 0 (5º campo) que muestra que no tiene contenido.
Usando el argumento -m, puede establecer permisos para permitir que otros usuarios escriban en las tuberías. Tenga en cuenta que por defecto el propietario puede leer y escribir y los demás sólo pueden leer. He aquí un ejemplo:
$ mkfifo -m 666 sharedpipe $ ls -l mypipe0 prw-rw-rw-. 1 shs shs 0 Aug 7 12:50 sharedpipe
Incluso cuando se envían datos a una tubería con nombre, ésta aparece vacía.
$ echo “Here comes some content” > mypipe $ ls -l mypipe prw-r--r--. 1 justme justme 0 Aug 13:57 mypipe
Otro proceso podría leer el contenido con un comando como este:
$ cat mypipe Here comes some content
Si ejecutamos el comando que envía los datos a la tubería en segundo plano, podemos leerlos con un comando cat. Observa que el archivo sigue apareciendo vacío en el listado de archivos, pero podemos recuperar el texto sólo una vez con un comando cat. Una vez recuperado, desaparece.
Puede leer también | Grabación de comandos en la línea de comandos de Linux
Sin embargo, nada nos impide enviar más datos a la tubería, siempre y cuando siga existiendo.
$ echo "Here comes some content" > mypipe & [1] 1593 $ ls -l mypipe prw-r--r--. 1 fedora fedora 0 Aug 5 13:55 mypipe $ cat mypipe Here comes some content [1]+ Done echo "Here comes some content" > mypipe $ cat mypipe ^C
Resumen
Las tuberías con nombre son más complejas que las tuberías sin nombre y se utilizan con mucha menos frecuencia, pero desempeñan un papel interesante en los sistemas Linux. Aquí hay dos posts anteriores - uno sobre el uso de posts sin nombre y otro sobre el uso de tuberías con nombre.