Esto se llama sustitución de proceso.
La <(list)
sintaxis es compatible con ambos bash
y zsh
. Proporciona una manera de pasar la salida de un comando ( list
) a otro comando cuando no se puede utilizar una tubería ( |
). Por ejemplo, cuando un comando simplemente no admite la entrada STDIN
o necesita la salida de varios comandos:
diff <(ls dirA) <(ls dirB)
<(list)
conecta la salida de list
con un archivo /dev/fd
, si es compatible con el sistema, de lo contrario se usa una tubería con nombre (FIFO) (que también depende del soporte del sistema; ninguno de los manuales dice qué sucede si ambos mecanismos no son compatibles, presumiblemente aborta con un error). El nombre del archivo se pasa como argumento en la línea de comando.
zsh
adicionalmente admite =(list)
como posible reemplazo para <(list)
. Con =(list)
un archivo temporal se utiliza en lugar de un archivo /dev/fd
o un FIFO. Se puede usar como reemplazo <(list)
si el programa necesita buscar en la salida.
Según el manual de ZSH, también puede haber otros problemas con el <(list)
funcionamiento:
El =
formulario es útil ya que tanto la /dev/fd
implementación de canalización con nombre como la de <(...)
tienen inconvenientes. En el primer caso, algunos programas pueden cerrar automáticamente el descriptor de archivo en cuestión antes de examinar el archivo en la línea de comando, especialmente si esto es necesario por razones de seguridad, como cuando el programa se está ejecutando setuid. En el segundo caso, si el programa no abre realmente el archivo, la subshell que intenta leer o escribir en la tubería bloqueará (en una implementación típica, los diferentes sistemas operativos pueden tener un comportamiento diferente) para siempre y tendrá que eliminarse explícitamente . En ambos casos, el shell realmente proporciona la información usando una tubería, de modo que los programas que esperan buscar (ver la página del manual lseek(2)
) en el archivo no funcionarán.
pfctl -f <(echo "pf rules")
diría que el descriptor de archivo es incorrecto. El uso de zsh y = (echo "pf rules") en su lugar funciona.