перенаправление справа налево в блок кода

перенаправление справа налево в блок кода

Рассмотрим такой сценарий:

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цикла часто является признаком того, что вы выбрали неправильный подход, особенно если это просто обработка текста.

Связанный контент