Na versão 4.2.47 (1) do Bash, quando eu tento criar um texto formatado que vem de um procedimento HERE, da seguinte forma:
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.
Estou tendo o erro a seguir:
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
)
Também não quero citar o documento HERE, ou seja <'FOOBAR'
, escrever , porque ainda quero que as variáveis sejam substituídas nele.
bash
process-substitution
here-document
Tim Friske
fonte
fonte
cat
ligação? Por que não deixar de ligarfmt
?(Even
por"(Even"
ele funcione. É o mesmo para\(Even
. Parece um bug de análise. O Bash ainda está em um contexto em que está procurando aparelhos, enquanto também está lendo o documento aqui e ambos os contextos se contradizem.bash
4.3, aliás.Respostas:
A substituição do processo é aproximadamente equivalente a isso.
Exemplo - mecânica de substituição de processos
Etapa # 1 - faça um fifo, envie para ele
Etapa # 2 - leia o fifo
O uso de parênteses no HEREDOC também parece bom:
Exemplo - apenas usando um FIFO
Etapa 1 - saída para FIFO
Etapa 2 - leia o conteúdo do FIFO
O problema, acredito que você esteja se deparando, é que a substituição do processo
<(...)
parece não se importar com o aninhamento de parênteses dentro dele.Exemplo - processo sub + HEREDOC não funciona
Escapar dos parênteses parece apaziguar um pouco:
Exemplo - escapando parens
Mas realmente não dá o que você quer. Equilibrar as parênteses também parece apaziguar:
Exemplo - balanceamento de parênteses
Sempre que tenho strings complexas, como esta para lidar com o Bash, quase sempre as construo primeiro, armazenando-as em uma variável e depois as utilizo através da variável, em vez de tentar criar um liner complicado que acaba sendo frágil.
Exemplo - use uma variável
Em seguida, imprima-o:
Referências
fonte
Esta é apenas uma solução alternativa. Canalize
fmt
para, emcat
vez de usar substituição de processofonte
bash
assistentes deste site. Meu conhecimento de internos do analisador festança é limitado para dizer o mínimoEssa é uma pergunta antiga e, como você percebe que este é um exemplo artificial (e, portanto, que a solução correta é usar
cat |
ou, na verdade, não existecat
neste caso), vou postar minha resposta no caso geral. Eu resolveria isso colocando-o em uma função e usando isso em seu lugar.e depois usar isso
fonte