Articulo de referencia

Sustitución de procesos

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 ...

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 de tiempo de compilación para ksh88, la versión de 1988 de KornShell de Bell Labs . [1] El shell rc proporciona la característica como "ramificación de tubería" 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 una 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 indica al intérprete de comandos que ejecute el comando y que haga que su salida aparezca como un archivo. El comando puede ser cualquier comando de shell de cualquier complejidad.

Sin sustitución de procesos, las alternativas son:

  1. Guarde la salida de los comandos en un archivo temporal y luego lea los archivos temporales.
    $ sort  archivo2  >  /tmp/archivo2.sorted
     $ sort  archivo1 | diff - /tmp/archivo2.sorted
     $ rm /tmp/archivo2.sorted
         
  2. Cree una tubería con nombre (también conocida como FIFO ), inicie un comando escribiendo en la tubería con nombre en segundo plano y 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 que utiliza los comandos tee, wcy gzipque cuentan las líneas de un archivo con wc -ly lo comprimen con gzipen una sola pasada:

$ tee  > ( wc  -l  > & 2 )  <  archivogrande | gzip > archivogrande.gz
    

Ventajas

Las principales ventajas de la sustitución de procesos frente a sus alternativas son:

  • Simplicidad : los comandos se pueden dar en línea; no es necesario guardar archivos temporales ni 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 disco.
  • Paralelismo : El proceso sustituido puede ejecutarse simultáneamente con el comando leyendo su salida o escribiendo su entrada, aprovechando el multiprocesamiento para reducir el tiempo total de cálculo.

Mecanismo

En esencia, la sustitución de procesos tiene dos implementaciones. En los sistemas que la admiten /dev/fd(la mayoría de los sistemas similares a Unix), funciona llamando a la pipe()llamada del sistema, que devuelve un descriptor de archivo $fdpara una nueva tubería anónima, luego crea la cadena /dev/fd/$fdy la sustituye en la línea de comandos. En los sistemas que no /dev/fdla admiten, llama mkfifocon un nuevo nombre de archivo temporal para crear una tubería con nombre y sustituye este nombre de archivo en la línea de comandos. Para ilustrar los pasos involucrados, considere la siguiente sustitución de comando simple en un sistema con /dev/fdsoporte:

$ diff  archivo1  < ( ordenar  archivo2 )

Los pasos que realiza el shell son:

  1. Crea una nueva tubería anónima. Esta tubería será accesible con algo como /dev/fd/63; puedes verla con un comando como echo <(true).
  2. Ejecutar el comando sustituido en segundo plano ( sort file2en este caso), canalizando su salida a la tubería anónima.
  3. Ejecute el comando principal y reemplace 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.
  4. Cuando finalice la ejecución, cierre la tubería anónima.

En el caso de las canalizaciones con nombre, la ejecución difiere únicamente en la creación y eliminación de la canalización; se crean con mkfifo(a la que se le asigna un nuevo nombre de archivo temporal) y se eliminan con unlink. Todos los demás aspectos permanecen iguales.

Limitaciones

Los "archivos" creados no se pueden buscar , lo que significa que el proceso que lee o escribe en el archivo no puede realizar acceso aleatorio ; debe leer o escribir una vez desde el principio hasta el final. 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]

Véase también

Referencias

  1. ^ Rosenblatt, Bill; Robbins, Arnold (abril de 2002). "Apéndice A.2". Aprendiendo el Korn Shell (2.ª ed.). O'Reilly & Associates. ISBN 0-596-00195-9.
  2. ^ Duff, Tom (1990). Rc — Un shell para sistemas Plan 9 y UNIX . CiteSeerX 10.1.1.41.3287 . 
  3. ^ Ramey, Chet (18 de agosto de 1994). Notas de la versión de Bash 1.14 . Free Software Foundation.Disponible en el archivo fuente de Gnu de la versión 1.14.7 a partir del 12 de febrero de 2016.
  4. ^ "ProcessSubstitution". Wiki de Greg . 22 de septiembre de 2016. Consultado el 6 de febrero de 2021 .

Lectura adicional

  • "Bash Reference Manual". The GNU Project . Free Software Foundation. 23 de diciembre de 2009 . Consultado el 1 de octubre de 2011 .
  • Cooper, Mendel (30 de agosto de 2011). "Advanced Bash-Scripting Guide". The Linux Documentation Project . Consultado el 1 de octubre de 2011 .
  • Frazier, Mitch (22 de mayo de 2008). "Bash Process Substitution". Linux Journal . Consultado el 1 de octubre de 2011 .
Obtenido de "https://es.wikipedia.org/w/index.php?title=Sustitución_de_procesos&oldid=1224844992#Canal_con_nombre_anónimo"