redirigir de derecha a izquierda al bloque de código

redirigir de derecha a izquierda al bloque de código

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. rcy derivados y fishtambié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 ashderivado.

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 shsintaxis estándar y tampoco funcionaría en dash.

En dash(o cualquier shimplementació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 dashmenos) 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 readbucle suele ser una indicación de que estás adoptando el enfoque equivocado., especialmente si es solo para procesamiento de texto.

información relacionada