GNU/Linux >> Znalost Linux >  >> Linux

Jak zkombinovat substituci Bashova procesu s dokumentem Here?

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
Související:Jak zkontrolovat, zda proces Oracle DB běží v Unixu a kde je nainstalován Oracle DB?
Linux
  1. Jak zabít proces zombie na Linuxu

  2. Linux – jak zkombinovat strom s velikostí adresáře?

  3. Jak najít proces s maximálním počtem deskriptorů souborů?

  1. Jak zabít proces s frází v jeho názvu?

  2. Jak ukončit podproces pythonu spuštěný s shell=True

  3. Restartujte proces na linuxu pomocí jeho pidn čísla pomocí příkazu kill, jak?

  1. Jak zkombinovat všechny řádky, které končí znakem zpětného lomítka?

  2. Proč substituce procesu Bash nefunguje s některými příkazy?

  3. Jak nakonfiguruji monit, aby spustil proces s konkrétním uživatelem?