GNU/Linux >> Tutoriales Linux >  >> Linux

¿Sustitución de proceso y tubería?

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?
Linux
  1. ¿Un Superblock, Inode, Dentry Y Un Archivo?

  2. ¿Por qué la sustitución del proceso Bash no funciona con algunos comandos?

  3. ¿Permisos de archivo y ahorro?

  4. ¿Redirigir y canalizar la salida?

  5. Cambiar la fecha de creación del archivo

Cómo obtener la fecha y hora actuales en Python

Archivos de inventario y configuración de Ansible

Cómo configurar la fecha y la hora en Linux

Bash - Comando de fecha y espacio

¿Crear archivo temporal frente a sustitución de procesos frente a expansión variable?

Volcar la memoria de un proceso de Linux en un archivo