W wersji Bash 4.2.47 (1) - wypuszczam, gdy próbuję catenate sformatowany tekst pochodzący z TUTAJ:
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.
Otrzymuję następujący błąd:
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
)
Nie chcę też cytować dokumentu TUTAJ, tj. Pisać <'FOOBAR'
, ponieważ nadal chcę, aby zmienne były w nim zastępowane.
bash
process-substitution
here-document
Tim Friske
źródło
źródło
cat
połączenia? Dlaczego nie zostawić tego na telefonfmt
?(Even
ze"(Even"
to działa. To samo dotyczy\(Even
. Wygląda jak błąd analizy. Bash wciąż jest w kontekście, w którym szuka nawiasów klamrowych, a także w kontekście czytania tutaj doc i oba konteksty są ze sobą sprzeczne.bash
Nawiasem mówiąc, zostało to naprawione w 4.3.Odpowiedzi:
Podstawienie procesu jest mniej więcej równoważne z tym.
Przykład - mechanika podstawienia procesu
Krok # 1 - stwórz fifo, wyślij do niego
Krok # 2 - przeczytaj piątkę
Korzystanie z parens w HEREDOC wydaje się również w porządku:
Przykład - wystarczy użyć FIFO
Krok # 1 - wysyłanie do FIFO
Krok # 2 - przeczytaj zawartość FIFO
Myślę, że problem polega na tym, że podstawienie procesu
<(...)
wydaje się nie dbać o zagnieżdżanie się w nim parenów.Przykład - proces sub + HEREDOC nie działa
Ucieczka przed parenami wydaje się nieco uspokajać:
Przykład - ucieczkowe pareny
Ale tak naprawdę nie daje ci tego, czego chcesz. Wyrównanie parens również wydaje się łagodzić:
Przykład - równoważenie parens
Ilekroć mam skomplikowane łańcuchy, takie jak ten, z którymi walczę w Bash, prawie zawsze najpierw je zbuduję, przechowując je w zmiennej, a następnie używam ich za pomocą zmiennej, zamiast próbować stworzyć jakiś trudny jeden liniowiec, który ostatecznie jest kruchy.
Przykład - użyj zmiennej
Następnie, aby go wydrukować:
Bibliografia
źródło
To tylko obejście. Rura
fmt
docat
zamiast stosowania procesu podstawienieźródło
bash
kreatorów na tej stronie. Moja wiedza na temat wewnętrznych parserów bash jest co najmniej ograniczonaTo stare pytanie i kiedy zdajesz sobie sprawę, że jest to wymyślony przykład (a zatem, że poprawnym rozwiązaniem jest użycie,
cat |
a właściwie wcale,cat
w tym przypadku wcale), po prostu opublikuję swoją odpowiedź na ogólny przypadek. Rozwiązałbym to, wprowadzając funkcję i używając jej zamiast tego.a następnie użyj tego
źródło