Вопрос

Что эта печатает вашу оболочку?

echo foo | while read line; do echo $line; done < <(echo bar)

Я ожидал, что это оценить echo foo | bar или foo < <(bar), оба из которых приведут к сообщения об ошибке.

В Bash 4.1.5 это выглядит как труба просто отбрасывается:

bar

В спешке:

sh: Syntax error: redirection unexpected
Это было полезно?

Решение

DASH не поддерживает замену процесса (<()).

Поведение, которое вы видите, является последовательным, если вы используете синтаксис, который поддерживается каждой из оболочек, которые вы сравниваете. Попробуй это:

echo hello | cat < inputfile

Вы должны увидеть содержимое «INVENTFILE», а не «Hello». Из нескольких снарядов я пытался, только Z Shell показал оба.

Это то, что говорит Posix относительно трубопроводов и перенаправления:

Стандартный выход команд1 должен быть подключен к стандартному входу команды2. Стандартный вход, стандартный вывод или оба команда должны быть рассмотрены, должны быть назначены трубопроводом перед любом перенаправлением, указанным операторами перенаправления, которые являются частью команды (см. Перенаправление).

Я интерпретирую это, чтобы означать, что в случае примера выше, трубопровод назначает stdin cat Затем перенаправление переопределяет его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top