Dos tubos a un comando

9

Estoy un poco confundido por la siguiente sintaxis. Aunque funciona, no entiendo por qué funciona. Parece que hay dos tuberías unidas al comando diff. ¿Pero no hay solo uno STDIN?

Ejemplos:

diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)
iblue
fuente
Aquí hay un enlace al tema relevante ( sustitución de procesos) en la bashpágina del manual.
chepner

Respuestas:

13

Las canalizaciones simplemente están vinculadas a descriptores de archivo diferentes a 0 (stdin):

$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62

Por supuesto, un proceso puede tener más de un descriptor de archivo abierto a la vez, por lo que no hay problema.

Sven Marnach
fuente
Si hubiera sabido que se llama tuberías temporales, habría podido buscarlo en Google. ¡Gracias!
@iblue: No creo que se llame "tuberías temporales". Son solo tuberías, tal como las creó la pipe()llamada al sistema.
Sven Marnach
Para ser muy exactos, podría llamarse "canalizaciones con nombre anónimo", pero es suficiente para googlearlo.
2
@WilliamPursell: No hay archivos involucrados. El shell crea una tubería anónima usando pipe()y luego bifurca los subprocesos. El principal proceso hace tienen descriptores de ficheros adicionales se abren si se utiliza un tubo en el anonimato. Estos descriptores de archivo adicionales se pasan en el formulario /dev/fd/..., y el proceso generalmente los abrirá simplemente usando estos nombres de archivo. Esto los llevará a ser dup()editados, creando aún más descriptores de archivos abiertos. El proceso también podría usar el descriptor de archivo con nombre de inmediato sin ninguna llamada abierta ...
Sven Marnach
1
... como se demuestra en este pequeño y estúpido programa de prueba . Después de compilar a, lo llamé como ./a <(ls), e imprimió con éxito la lista de archivos, demostrando que el descriptor de archivo nombrado (63 en mi caso) ya estaba abierto. El bash podría usar canalizaciones con nombre en un directorio temporal en arquitecturas diferentes a Linux, en cuyo caso no se abrirían descriptores de archivo adicionales al ingresar al proceso principal.
Sven Marnach