Тест двойного перенаправления
-
30-09-2019 - |
Вопрос
Что эта печатает вашу оболочку?
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
Затем перенаправление переопределяет его.