En la versión 4.2.47(1) de Bash, cuando trato de clasificar texto formateado que proviene de un documento HERE 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.
Recibo 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 HERE, es decir, escribir <'FOOBAR'
, porque todavía quiero que se sustituyan las variables dentro de él.
Respuesta aceptada:
La sustitución del proceso es más o menos equivalente a esto.
Ejemplo:mecánica de sustitución de procesos
Paso n.º 1:haz un fifo, envíalo
$ mkfifo /var/tmp/fifo1
$ fmt --width=10 <<<"$(seq 10)" > /var/tmp/fifo1 &
[1] 5492
Paso n.° 2:lea el fifo
$ 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 paréntesis dentro de HEREDOC también parece correcto:
Ejemplo:solo usando un FIFO
Paso n.º 1:salida a FIFO
$ fmt --width=10 <<FOO > /var/tmp/fifo1 &
(one)
(two
FOO
[1] 10628
Paso n.º 2:leer el contenido de FIFO
$ cat /var/tmp/fifo1
(one)
(two
El problema, creo que te estás encontrando, es que la sustitución del proceso, <(...)
, no parece importarle el anidamiento de parens dentro de él.
Ejemplo:proceso sub + 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:escapar de parens
$ cat <(fmt --width=10 <<FOO
(one)
(two
FOO
)
(one)
(two
Pero realmente no te da lo que quieres. Equilibrar los paréntesis también parece apaciguarlo:
Ejemplo:paréntesis equilibrados
$ cat <(fmt --width=10 <<FOO
(one)
(two)
FOO
)
(one)
(two)
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 trazador de líneas complicado que termina siendo frágil.
Ejemplo:usar una variable
$ var=$(fmt --width=10 <<FOO
(one)
(two
FOO
)
Luego para imprimirlo:
$ echo "$var"
(one)
(two
Referencias
- Sustitución de procesos
- ¿Cómo puedo escribir un documento aquí en un archivo en bash script?
- Uso de canalizaciones con nombre y sustitución de procesos
- Corchetes de cierre en documentos aquí