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 cat
en 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 fmt
hacia cat
en 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