Что происходит, так это то, что stdio одновременно читает весь канал из канала, а размер буфера в Linux составляет 8K.
Затем head
читает первые 10 строк из буфера, печатает их и завершает работу.
Следующая head
начинает чтение из канала, где остановился последний, 8K байт в файл. Он читает эту строку и следующие 9 строк. 60
, который вы видите - это конец 1860
.
Причина, по которой он работает, как и ожидалось, в последнем случае, заключается в том, что head
ищет конец последней строки, напечатанной перед выходом. Поиск не работает в трубе, так что это не имеет никакого эффекта. Но когда stdin
является обычным файлом, поиск работает, и следующий процесс начинается с того места, где поиск устанавливает позицию файла.
Я вижу немного другие результаты на моем Mac. Размер буфера составляет 64 КБ, поэтому второй head
начинается намного позже в файле. Он также не выполняет поиск назад до конца последней напечатанной строки перед выходом, поэтому версия с перенаправлением файла работает так же, как конвейер.