Это как если бы я сказал вам поднять руку, как только произнесу четвертое от последнего слова, которое я собираюсь сказать. Я не собираюсь говорить вам заранее, сколько слов я собираюсь сказать.
Труба - это поток . Его данные не имеют размера, у него есть только операции для получения следующего элемента из него и / или вставки в него элемента, и результатом является либо фрагмент данных, либо сигнал о том, что данных больше нет.
Таким образом, если вы сначала не извлечете все данные из потока, не поместите их в буфер, не подсчитаете их длину, не перемотаете поток и не получите на четыре элемента меньше, это невозможно сделать.
РЕДАКТИРОВАТЬ: мне нужно сделать больше продумывая вещи вместо того, чтобы придумывать умные аналогии :) Поток не говорит «немедленно остановить меня n элементов перед последним», а скорее «передать все элементы, кроме последнего n», и путем поддержания буфер из только n элементов, и ожидание, пока первые n элементов не будут получены, прежде чем передать первый, возможно. Очевидно, что это не будет работать в таких ситуациях, как телекоммуникации, когда вы хотите, чтобы данные отправлялись сразу после их получения, как вы могли бы, если бы вам нужны были первые n элементов. И я полагаю truncate
, не делает это таким образом.
(попытка понизить самость -1)
cat input.txt | some-process
лучше написано какsome_process < input.txt
.