En la versión 4.2.47 (1) de Bash, suelte cuando intento catear texto formateado que proviene de un mensaje AQUÍ, así:
cat <(fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
) # I want this paranthesis to end the process substitution.
Obtuve el siguiente error:
bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
)
Además, no quiero citar el documento AQUÍ, es decir <'FOOBAR'
, escribir , porque todavía quiero que las variables se sustituyan dentro de él.
bash
process-substitution
here-document
Tim Friske
fuente
fuente
cat
llamada? ¿Por qué no dejarlo en la llamadafmt
?(Even
con la"(Even"
que funciona. Es lo mismo para\(Even
. Parece un error de análisis. Bash todavía está en un contexto en el que está buscando llaves, mientras que también está en el contexto de leer el documento aquí y ambos contextos se contradicen entre sí.bash
4.3, por cierto.Respuestas:
La sustitución del proceso es más o menos equivalente a esto.
Ejemplo: mecánica de sustitución de procesos
Paso # 1 - haz un fifo, dale salida
Paso # 2 - lee el fifo
El uso de parens dentro del HEREDOC también parece correcto:
Ejemplo: solo usando un FIFO
Paso # 1 - salida a FIFO
Paso # 2 - lee el contenido de FIFO
El problema, creo que te estás encontrando es que la sustitución del proceso
<(...)
no parece importarle el anidamiento de los padres dentro de él.Ejemplo: el proceso sub + HEREDOC no funciona
Escapar de los padres parece apaciguarlo un poco:
Ejemplo: escapar de los padres
Pero realmente no te da lo que quieres. Hacer que los padres estén equilibrados también parece calmarlo:
Ejemplo: equilibrio de parens
Cada vez que tengo cadenas complejas, como esta con las que lidiar en Bash, casi siempre las construyo primero, las almaceno en una variable y luego las uso a través de la variable, en lugar de intentar crear un forro complicado que termine siendo frágil.
Ejemplo: use una variable
Luego para imprimirlo:
Referencias
fuente
Esto es solo una solución alternativa. Tubería
fmt
encat
lugar de usar la sustitución del procesofuente
bash
asistentes en este sitio. Mi conocimiento de los componentes internos de bash parser se limita, por decir lo menosEsta es una vieja pregunta, y cuando se dé cuenta de que este es un ejemplo artificial (y, por lo tanto, que la solución correcta es usar
cat |
o no,cat
en absoluto en este caso), simplemente publicaré mi respuesta para el caso general. Lo resolvería poniéndolo en una función y usándolo en su lugar.y luego usar eso
fuente