¿Cómo combinar la sustitución de procesos de Bash con el documento HERE?

¿Cómo combinar la sustitución de procesos de Bash con el documento HERE?

En la versión 4.2.47(1) de Bash, cuando intento encadenar texto formateado que proviene de un documento AQUÍ de esta manera:

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, escribir <'FOOBAR', porque todavía quiero que se sustituyan variables dentro de él.

Respuesta1

Esta es una vieja pregunta y, como se dará cuenta de que se trata de un ejemplo artificial (y, por lo tanto, de que la solución correcta es usar cat |o, en realidad, no caten este caso), simplemente publicaré mi respuesta para el caso general. Lo resolvería poniéndolo en una función y usándola en su lugar.

fmt-func() {
    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
}

y luego usar eso

cat <(fmt-func)

Respuesta2

El proceso de sustitución es aproximadamente equivalente a esto.

Ejemplo: mecánica de sustitución de procesos.

Paso #1: haz un quincena y envíale la salida

$ mkfifo /var/tmp/fifo1
$ fmt --width=10 <<<"$(seq 10)" > /var/tmp/fifo1 &
[1] 5492

Paso 2: lee el quince

$ cat /var/tmp/fifo1
1 2 3 4
5 6 7 8
9 10
[1]+  Done                    fmt --width=10 <<< "$(seq 10)" > /var/tmp/fifo1

El uso de padres dentro de HEREDOC también parece correcto:

Ejemplo: simplemente usando un FIFO

Paso #1 - salida a FIFO

$ fmt --width=10 <<FOO > /var/tmp/fifo1 &
(one)
(two
FOO
[1] 10628

Paso #2 - leer el contenido de FIFO

$ cat /var/tmp/fifo1
(one)
(two

Creo que el problema con el que te estás encontrando es que al proceso de sustitución <(...)no parece importarle el anidamiento de los padres dentro de él.

Ejemplo: el subproceso + HEREDOC no funciona

$ cat <(fmt --width=10 <<FOO
(one)
(two
FOO
)
bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOO
(one)
(two
FOO
)
$

Escapar de los padres parece apaciguarlo un poco:

Ejemplo: padres que escapan

$ cat <(fmt --width=10 <<FOO                 
\(one\)
\(two
FOO
)
\(one\)
\(two

Pero realmente no te da lo que quieres. Equilibrar los padres también parece apaciguarlo:

Ejemplo: pares equilibradores

$ cat <(fmt --width=10 <<FOO
(one)
(two)
FOO
)
(one)
(two)

Siempre que tengo que lidiar con cadenas complejas, como esta 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 una línea complicada que termine siendo frágil.

Ejemplo: usar una variable

$ var=$(fmt --width=10 <<FOO
(one)
(two
FOO
)

Luego para imprimirlo:

$ echo "$var"
(one)
(two

Referencias

Respuesta3

Esto es sólo una solución. Canalizar fmthacia caten lugar de utilizar la sustitución de procesos

fmt --width=10 <<FOOBAR | cat 
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR

información relacionada