Тест двойного перенаправления - PullRequest
3 голосов
/ 07 января 2011

Что означает это печать вашей оболочки?

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

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

В Bash 4.1.5 похоже, что труба просто отбрасывается:

bar

In Dash:

sh: Syntax error: redirection unexpected

1 Ответ

3 голосов
/ 07 января 2011

Dash не поддерживает подстановку процессов (<()).

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

echo hello | cat < inputfile

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

Это то, что говорит POSIX относительно конвейеров и перенаправления:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...