GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo combinar la sustitución del proceso de Bash con el documento Here?

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í
Relacionado:¿Cómo verificar si el proceso de Oracle DB se está ejecutando en Unix y dónde está instalado Oracle DB?
Linux
  1. ¿Por qué la sustitución del proceso Bash no funciona con algunos comandos?

  2. ¿Cómo encontrar el proceso con el máximo de descriptores de archivo?

  3. Cómo finalizar un subproceso de python iniciado con shell=True

  4. ¿Cómo matar todos los procesos con un nombre parcial dado?

  5. Reinicie el proceso en Linux por su número pidn con el comando kill, ¿cómo?

Cómo matar un proceso en Linux

Cómo integrar ONLYOFFICE 9.6 con WordPress

Cómo asegurar servidores Linux con SE Linux

Cómo trabajar con procesos en primer plano y en segundo plano en Linux

cómo *iniciar* un proceso con alta prioridad

Cómo matar un proceso <difunto> con el padre 1