Рассмотрим такой сценарий:
diff file.txt <( cat file.txt | grep -v '^\s*#'| sed '/^$/d' )
это пример перенаправления справа налево, в котором вы обрабатываете файл и перенаправляете результат как входные данные в diff
. Похожий вариант использования был предложенздесь, который также отлично работает.
Однако попытка перенаправить результат обработки файла в блок кода аналогичным образом не удалась:
while read I; do
…
done <( cat $FIL | <do_something_here> )
Syntax error: "(" unexpected
Или, если вы попробуете это:
done < <( cat $FIL | <do_something_here> )
Syntax error: redirection unexpected
Как перенаправить вывод некоторого процесса в блок кода в качестве входных данных?
решение1
<(...)
замена процессаявляется функцией оболочки Korn. Она также доступна в zsh и bash. rc
и производных и fish
также имеет поддержку подстановки процессов, но с другим синтаксисом, в то время как в оболочке yash <(...)
есть синтаксис для другой функции:перенаправление процесса.
Формулировка этогоСинтаксическая ошибка: неожиданное перенаправлениеошибка предполагает, что ваша оболочка является производной от оболочки Almquist, такой как dash
. Насколько мне известно, ни одна из нихзамена процессаниперенаправление процессабыли добавлены к какой-либо ash
производной.
while ...; done <(cmd)
будет работать в yash
, while ...; done < <(cmd)
будет работать в AT&T ksh, zsh и bash, но ни один из них не является стандартным sh
синтаксисом и ни один из них не будет работать в dash
.
В dash
(или любой другой sh
реализации) вам понадобится cmd | while ...; done
, хотя обратите внимание, что в dash
, этот цикл while будет выполняться в подоболочке.
Вы можете сделать:
while ...; done << EOF
$(cmd)
EOF
Однако будьте осторожны: он сохраняет весь вывод cmd
(за исключением всех символов NUL (по dash
крайней мере) и всех конечных символов новой строки) в памяти (и добавляет один дополнительный символ новой строки).
В любом случае,использование while read
цикла часто является признаком того, что вы выбрали неправильный подход, особенно если это просто обработка текста.