En informática, la sustitución de procesos es una forma de comunicación entre procesos que permite que la entrada o salida de un comando aparezca como un archivo. El comando se sustituye en línea, donde normalmente aparecería un nombre de archivo, por el shell de comandos . Esto permite que los programas que normalmente solo aceptan archivos lean o escriban directamente en otro programa.
Historia
La sustitución de procesos estaba disponible como una opción en tiempo de compilación para ksh88
la versión de 1988 de KornShell de Bell Labs . [1] El shell rc proporciona la función como "ramificación de canalización" en la versión 10 de Unix , lanzada en 1990. [2] El shell Bash proporcionó la sustitución de procesos a más tardar en la versión 1.14, lanzada en 1994. [3]
Ejemplo
Los siguientes ejemplos utilizan la sintaxis de KornShell.
El comando diff de Unix normalmente acepta los nombres de dos archivos para comparar, o un nombre de archivo y entrada estándar. La sustitución de procesos permite comparar la salida de dos programas directamente:
$ diff < ( ordenar archivo1 ) < ( ordenar archivo2 )
La <(command)
expresión le dice al intérprete de comandos que ejecute el comando y haga que su salida aparezca como un archivo. El comando puede ser cualquier comando de shell arbitrariamente complejo.
Sin sustitución de procesos, las alternativas son:
- Guarde la salida de los comandos en un archivo temporal y luego lea los archivos temporales.
$ ordenar archivo2> /tmp/file2.sorted $ ordenar archivo1 | diff - /tmp/file2.sorted $ rm /tmp/file2.sorted
- Cree una tubería con nombre (también conocida como FIFO ), inicie un comando escribiendo en la tubería con nombre en segundo plano, luego ejecute el otro comando con la tubería con nombre como entrada.
$ mkfifo /tmp/sort2.fifo $ ordenar archivo2> /tmp/sort2.fifo & $ ordenar archivo1 | diff - /tmp/sort2.fifo $ rm /tmp/sort2.fifo
Ambas alternativas son más engorrosas.
La sustitución de procesos también se puede utilizar para capturar la salida que normalmente iría a un archivo y redirigirla a la entrada de un proceso. La sintaxis de Bash para escribir en un proceso es >(command)
. Aquí hay un ejemplo usando los comandos tee
, wc
y gzip
que cuenta las líneas en un archivo wc -l
y las comprime gzip
en una sola pasada:
$ tee> ( wc -l> & 2 ) | gzip> bigfile.gz
Ventajas
Las principales ventajas de la sustitución de procesos frente a sus alternativas son:
- Sencillez : los comandos se pueden dar en línea; no es necesario guardar archivos temporales o crear canalizaciones con nombre primero.
- Rendimiento : leer directamente desde otro proceso suele ser más rápido que tener que escribir un archivo temporal en el disco y luego volver a leerlo. Esto también ahorra espacio en el disco.
- Paralelismo : El proceso sustituido se puede ejecutar simultáneamente con el comando leyendo su salida o escribiendo su entrada, aprovechando el multiprocesamiento para reducir el tiempo total para el cálculo.
Mecanismo
Bajo el capó, la sustitución de procesos tiene dos implementaciones. En los sistemas que admiten /dev/fd
(la mayoría de los sistemas similares a Unix), funciona llamando a la llamada al pipe()
sistema, que devuelve un descriptor de archivo $fd
para una nueva tubería anónima, luego crea la cadena /dev/fd/$fd
y la sustituye en la línea de comandos. En sistemas sin /dev/fd
soporte, llama mkfifo
con un nuevo nombre de archivo temporal para crear una tubería con nombre y sustituye este nombre de archivo en la línea de comando. Para ilustrar los pasos involucrados, considere la siguiente sustitución de comando simple en un sistema con /dev/fd
soporte:
$ diff file1 < ( ordenar archivo2 )
Los pasos que realiza el shell son:
- Cree una nueva tubería anónima. Esta tubería será accesible con algo como
/dev/fd/63
; puedes verlo con un comando comoecho <(true)
. - Ejecute el comando sustituido en segundo plano (
sort file2
en este caso), canalizando su salida a la canalización anónima. - Ejecute el comando principal, reemplazando el comando sustituido con la ruta de la tubería anónima. En este caso, el comando completo podría expandirse a algo como
diff file1 /dev/fd/63
. - Cuando finalice la ejecución, cierre la tubería anónima.
Para canalizaciones con nombre, la ejecución difiere únicamente en la creación y eliminación de la canalización; se crean con mkfifo
(al que se le asigna un nuevo nombre de archivo temporal) y se eliminan con unlink
. Todos los demás aspectos siguen siendo los mismos.
Limitaciones
Los "archivos" creados no se pueden buscar , lo que significa que el proceso de lectura o escritura en el archivo no puede realizar un acceso aleatorio ; debe leer o escribir una vez de principio a fin. Los programas que comprueban explícitamente el tipo de un archivo antes de abrirlo pueden negarse a trabajar con la sustitución de procesos, porque el "archivo" resultante de la sustitución de procesos no es un archivo normal . Además, hasta Bash 4.4 (publicado en septiembre de 2016), no era posible obtener el código de salida de un comando de sustitución de procesos desde el shell que creó la sustitución de procesos. [4]
Ver también
Referencias
- ^ Rosenblatt, Bill; Robbins, Arnold (abril de 2002). "Apéndice A.2". Aprendiendo el Korn Shell (2ª ed.). O'Reilly y asociados. ISBN 0-596-00195-9.
- ^ Duff, Tom (1990). Rc: un shell para sistemas Plan 9 y UNIX . CiteSeerX 10.1.1.41.3287 .
- ^ Ramey, Chet (18 de agosto de 1994). Notas de la versión Bash 1.14 . Fundación de Software Libre.Disponible en el archivo fuente de GNU de la versión 1.14.7 a partir del 12 de febrero de 2016.
- ^ "ProcessSubstitution" . Wiki de Greg . 22 de septiembre de 2016 . Consultado el 6 de febrero de 2021 .
Otras lecturas
- "Manual de referencia de Bash" . El Proyecto GNU . Fundación de Software Libre. 23 de diciembre de 2009 . Consultado el 1 de octubre de 2011 .
- Cooper, Mendel (30 de agosto de 2011). "Guía avanzada de Bash-Scripting" . El proyecto de documentación de Linux . Consultado el 1 de octubre de 2011 .
- Frazier, Mitch (22 de mayo de 2008). "Sustitución del proceso Bash" . Diario de Linux . Consultado el 1 de octubre de 2011 .