Ve verzi Bash 4.2.47(1)-uvolnění, když se pokusím zařadit formátovaný text, který pochází z dokumentu HERE, jako je tento:
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.
Zobrazuje se mi následující chyba:
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
)
Také nechci citovat dokument HERE, tj. psát <'FOOBAR'
, protože stále chci, aby se v něm nahrazovaly proměnné.
Přijatá odpověď:
Substituce procesu je tomu zhruba ekvivalentní.
Příklad – mechanika substituce procesů
Krok č. 1 – vytvořte fifo a vytiskněte jej
$ mkfifo /var/tmp/fifo1
$ fmt --width=10 <<<"$(seq 10)" > /var/tmp/fifo1 &
[1] 5492
Krok č. 2 – přečtěte si 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
Použití závorek v rámci HEREDOC se také zdá být v pořádku:
Příklad – pouze pomocí FIFO
Krok č. 1 – výstup do FIFO
$ fmt --width=10 <<FOO > /var/tmp/fifo1 &
(one)
(two
FOO
[1] 10628
Krok #2 – čtení obsahu FIFO
$ cat /var/tmp/fifo1
(one)
(two
Myslím, že problém, na který narážíte, je ten, že substituce procesu, <(...)
, nezdá se, že by se staral o hnízdění rodičů v něm.
Příklad – dílčí proces + HEREDOC nefungují
$ cat <(fmt --width=10 <<FOO
(one)
(two
FOO
)
bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOO
(one)
(two
FOO
)
$
Zdá se, že útěk před závorkami to trochu uklidňuje:
Příklad – escapování závorek
$ cat <(fmt --width=10 <<FOO
(one)
(two
FOO
)
(one)
(two
Ale ve skutečnosti vám nedá to, co chcete. Zdá se, že vyvážení závorek to také uklidňuje:
Příklad – vyrovnávací závorky
$ cat <(fmt --width=10 <<FOO
(one)
(two)
FOO
)
(one)
(two)
Kdykoli mám složité řetězce, jako je tento, se kterými se musím potýkat v Bash, téměř vždy je nejprve zkonstruuji, uložím je do proměnné a poté je použiji prostřednictvím proměnné, než abych se pokoušel vytvořit nějakou záludnou jednu vložku, která skončí jako křehké.
Příklad – použijte proměnnou
$ var=$(fmt --width=10 <<FOO
(one)
(two
FOO
)
Poté jej vytiskněte:
$ echo "$var"
(one)
(two
Odkazy
- Zpracovat nahrazování
- Jak mohu napsat zde dokument do souboru ve skriptu bash?
- Používání pojmenovaných kanálů a nahrazování procesů
- Zavírací závorky v dokumentech zde