Почему ответ «да» не заполняет буфер?

Почему ответ «да» не заполняет буфер?

Допустим, я делаю что-то вроде yes | apt-get install foo. Я знаю, что это yesбудет безостановочно печатать кучу y\n' в stdout. Но apt-getможет обработать только несколько из них. Почему не заполняет yesбуфер? Он на самом деле печатает только y\nпо запросу apt-get?

решение1

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

Действительно ли он печатает только y\nпо запросу apt-get?

Да. Правая сторона каналов работает в то же время, когда левая сторона производит вывод. Более того, левая сторона не перейдет к "завершению", если это не требуется. Например, следующий код создаст бесконечный цикл, записывающий в терминал, пока не будет завершен.

while true; do echo foo; done

Однако следующий код выведет 10 строк, а затем корректно завершит работу.

while true; do echo foo; done | head

После headзавершения команды левая сторона трубы больше не должна работать, и «бесконечный» цикл прекращается.

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