Причина, по которой "труба только" появляется четыре раза, на самом деле состоит в том, что функция context
работает правильно, аecho $'foo bar' | while read x
и т. д. является трубой--все в цикле while
получает ввод из канала. Чтобы получить желаемый результат, измените цикл while
на цикл for
и ничего не подключайте к этому циклу for
:
for x in foo bar; do context ; echo 'f' | context; done
Выход:
no pipes
pipe in only
no pipes
pipe in only
Чтобы показать, где ошибка в коде OP, просто передайте что-нибудь в цикл for
и посмотрите, что произойдет:
echo | for x in foo bar; do context ; echo 'f' | context; done
Выход:
pipe in only
pipe in only
pipe in only
pipe in only
Новичок может (ошибочно )предположить, что while read x
потребляет весь стандартный ввод, но это не обязательно так. Рассмотрим этот пример,с read
внутри петли while
:
printf '%s\n' foo bar baz buzz |
while read x; do echo $x; read y; echo ${y^^} ;done
Выход:
foo
BAR
baz
BUZZ
К сожалению, у меня есть ответ только на ваш альтернативный вопрос. Надлежащим каналом для сообщения об этой ошибке является список рассылки ядра Linux. Инструкции о том, как отправить сообщение, как соблюдать правила этикета и как подписаться (или получить ответы на свое сообщение, если вы не хотите получать огромные объемы, связанные с подпиской ), можно найти здесь :
.http://vger.kernel.org/lkml/#s3
Уровень детализации, который вы предоставили, превосходен и будет очень полезен для отчета об ошибке, но не удивляйтесь, если вам потребуется еще больше информации.