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)
bash
página del manual.Respuestas:
Las canalizaciones simplemente están vinculadas a descriptores de archivo diferentes a 0 (stdin):
Por supuesto, un proceso puede tener más de un descriptor de archivo abierto a la vez, por lo que no hay problema.
fuente
pipe()
llamada al sistema.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 serdup()
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 ...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.