tail
умрет из-за сигнала SIGPIPE, как только он попытается записать в канал, когда у него нет считывателя.
Итак, tail
умрет вскоре после того, как head
завершит вывод своих 10000 строк и завершит работу.
Поскольку каналы могут содержать некоторые данные (64 КБ в Linux) и поскольку tail
буферизует свой вывод, когда не на терминал (8 КБ в моем тесте), а head
и tail
считывают ввод по частям (до 8 КБ в моих тестах), tail
может читать до 64 + 8 + 8 КБ после конца 10000-й строки после смещения
перед смертью.
Наихудший сценарий - когда head
опорожняет трубу медленнее, чем tail
- это заполнение (например, при записи на медленный вывод, такой как терминал), и если последний байт 10000-й строки находится в начале блока размером 8 кБайт.
Затем, в конце концов, head
прочитает блок с последней новой строкой в начале (на 8191 байт больше, чем необходимо), но будет занят записью своего вывода. tail
, за это время заполнивший канал (64 КБ), прочитал еще один блок размером 8 КБ, но, когда канал заполнен, запись в него блокируется. Как только head
запишет свою последнюю строку и завершится, tail
умрет, но прочитает 64 КБ + 8 КБ + 8191 байт после последней из этих 10000 строк.
Наилучший сценарий - когда последняя из 10000 строк находится в самом конце блока 8kiB и head
считывает данные, как только они помещаются в конвейер tail
.Затем, если в последнем блоке head
удастся прочитать его из конвейера и выйти до того, как tail
запишет следующий блок, то tail
умрет после записи следующий блок, поэтому он будет читать только 8192 байта после конца этой 10000-й строки.
Предполагается, что somefile
является обычным файлом. Он мог бы завершиться раньше, если бы somefile
был неким королем специального файла, который, например, переходит по одному байту за раз (например, канал из while:; do echo; done
)
Нет. И вывод труб не повлияет на то, что читается на хвосте.
С опцией смещения вашего символа -c + offset
tail будет искать позицию, а затем читать с этой точки.