В Bash версии 4.2.47 (1) -релиз, когда я пытаюсь наклеить отформатированный текст, полученный из HERE-dcoument, примерно так:
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.
Я получаю следующую ошибку:
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
)
Также я не хочу цитировать HERE-документ, т.е. писать <'FOOBAR'
, потому что я все еще хочу, чтобы в нем были подставлены переменные.
bash
process-substitution
here-document
Тим Фриске
источник
источник
cat
звонок? Почему бы не оставить это при звонкеfmt
?(Even
на"(Even"
это работает. Это то же самое для\(Even
. Похоже, ошибка разбора. Bash все еще находится в контексте, где он ищет фигурные скобки, а также в контексте чтения документа здесь, и оба контекста противоречат друг другу.bash
4.3, кстати.Ответы:
Процесс замещения примерно эквивалентен этому.
Пример - механика процесса замещения
Шаг № 1 - сделать фифо, вывести на него
Шаг № 2 - читать Фио
Использование паренов в HEREDOC также кажется нормальным:
Пример - просто использование FIFO
Шаг № 1 - вывод в FIFO
Шаг № 2 - прочитать содержимое FIFO
Проблема, я полагаю, вы сталкиваетесь с тем, что замена процесса
<(...)
, кажется, не заботится о вложении паренов внутри него.Пример - процесс sub + HEREDOC не работает
Бегство от паренов, кажется, немного успокаивает:
Пример - избегание паренов
Но на самом деле не дает вам то, что вы хотите. Сбалансирование паренсов также, кажется, успокаивает:
Пример - балансирование паренов
Всякий раз, когда у меня есть сложные строки, такие как эта, с которыми приходится бороться в Bash, я почти всегда буду сначала создавать их, сохраняя их в переменной, а затем использовать их через переменную, вместо того, чтобы пытаться создать какой-нибудь хитрый один вкладыш, который в итоге окажется хрупкий.
Пример - использовать переменную
Затем распечатать это:
Ссылки
источник
Это просто обходной путь. Труба ,
fmt
чтобыcat
вместо того , чтобы использовать замену процессаисточник
bash
волшебников на этом сайте. Мои знания внутренних компонентов bash parser ограничены,Это старый вопрос, и, поскольку вы понимаете, что это надуманный пример (и, следовательно, правильное решение - использовать
cat |
или вообще нет,cat
в данном случае вообще нет ), я просто опубликую свой ответ для общего случая. Я бы решил это, поместив его в функцию и используя вместо этого.а затем использовать это
источник