Considere este escenario:
diff file.txt <( cat file.txt | grep -v '^\s*#'| sed '/^$/d' )
Este es un ejemplo de redirección de derecha a izquierda, en el que procesa un archivo y redirige el resultado como entrada a diff
. Se ha propuesto un caso de uso similaraquí, que también funciona bien.
Sin embargo, el intento de redirigir el resultado del procesamiento de archivos a un bloque de código de manera similar falla:
while read I; do
…
done <( cat $FIL | <do_something_here> )
Syntax error: "(" unexpected
O, si intentas esto:
done < <( cat $FIL | <do_something_here> )
Syntax error: redirection unexpected
¿Cómo se redirige la salida de algún proceso al bloque de código como entrada?
Respuesta1
<(...)
sustitución de procesoses una característica del caparazón Korn. También está disponible en zsh y bash. rc
y derivados y fish
también tienen soporte de sustitución de procesos pero con una sintaxis diferente, mientras que en el shell yash <(...)
hay una sintaxis para una característica diferente:redirección de procesos.
La redacción de eseError de sintaxis: redirección inesperadaEl error sugiere que su shell es un derivado de Almquist, como por ejemplo dash
. AFAIK, tampocosustitución de procesosniredirección de procesosse han añadido a cualquier ash
derivado.
while ...; done <(cmd)
funcionaría en yash
, while ...; done < <(cmd)
funcionaría en AT&T ksh, zsh y bash, pero ninguna de las dos tiene sh
sintaxis estándar y tampoco funcionaría en dash
.
En dash
(o cualquier sh
implementación), necesitaría cmd | while ...; done
, aunque tenga en cuenta que en dash
, ese bucle while se ejecutaría en una subcapa.
Podrías hacerlo:
while ...; done << EOF
$(cmd)
EOF
Aunque tenga en cuenta que almacena toda la salida de cmd
(eliminados todos los caracteres NUL (al dash
menos) y todos los caracteres de nueva línea finales) en la memoria (y vuelve a agregar un carácter de nueva línea adicional).
En todo caso,El uso de un while read
bucle suele ser una indicación de que estás adoptando el enfoque equivocado., especialmente si es solo para procesamiento de texto.