Me preguntaba cómo entender lo siguiente:
Conectar la salida estándar de un comando a la entrada estándar de otro es una técnica
poderosa. Pero, ¿qué sucede si necesita canalizar la salida estándar de múltiples comandos
? Aquí es donde entra en juego la sustitución de procesos.
En otras palabras, ¿puede la sustitución de procesos hacer lo que la tubería puede hacer?
¿Qué puede hacer la sustitución de procesos, pero la canalización no?
Respuesta aceptada:
Una buena manera de asimilar la diferencia entre ellos es experimentar un poco en la línea de comandos. A pesar de la similitud visual en el uso de <
carácter, hace algo muy diferente a una redirección o canalización.
Usemos la date
comando para probar.
$ date | cat
Thu Jul 21 12:39:18 EEST 2011
Este es un ejemplo sin sentido, pero muestra que cat
aceptó la salida de date
en STDIN y escupirlo de nuevo. Se pueden lograr los mismos resultados mediante la sustitución de procesos:
$ cat <(date)
Thu Jul 21 12:40:53 EEST 2011
Sin embargo, lo que sucedió detrás de escena fue diferente. En lugar de recibir un flujo STDIN, cat
en realidad se le pasó el nombre de un archivo que necesitaba abrir y leer. Puedes ver este paso usando echo
en lugar de cat
.
$ echo <(date)
/proc/self/fd/11
Cuando cat recibió el nombre del archivo, leyó el contenido del archivo por nosotros. Por otro lado, echo solo nos mostró el nombre del archivo que se pasó. Esta diferencia se vuelve más obvia si agrega más sustituciones:
$ cat <(date) <(date) <(date)
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
$ echo <(date) <(date) <(date)
/proc/self/fd/11 /proc/self/fd/12 /proc/self/fd/13
Es posible combinar la sustitución de procesos (que genera un archivo) y la redirección de entrada (que conecta un archivo a STDIN):
$ cat < <(date)
Thu Jul 21 12:46:22 EEST 2011
Se ve más o menos igual, pero esta vez se pasó cat a la transmisión STDIN en lugar de un nombre de archivo. Puedes ver esto probándolo con echo:
$ echo < <(date)
<blank>
Dado que echo no lee STDIN y no se pasó ningún argumento, no obtenemos nada.
Las canalizaciones y los redireccionamientos de entrada empujan el contenido a la transmisión STDIN. La sustitución de procesos ejecuta los comandos, guarda su salida en un archivo temporal especial y luego pasa ese nombre de archivo en lugar del comando. Cualquier comando que esté usando lo trata como un nombre de archivo. Tenga en cuenta que el archivo creado no es un archivo normal sino una canalización con nombre que se elimina automáticamente una vez que ya no se necesita.
Relacionado:¿Los eventos filtrados en Process Monitor se almacenan en la memoria o en el disco?