Допустим, я делаю что-то вроде 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
завершения команды левая сторона трубы больше не должна работать, и «бесконечный» цикл прекращается.