Ваш скрипт взаимодействует с less
через канал .Канал представляет собой поток байтов в памяти, который соединяет две конечные точки: ваш скрипт и программу less
, первый из которых записывает выходные данные, а второй читает из него.
Поскольку каналы находятся в памяти, онбыло бы не приятно, если бы они росли сколь угодно большими.Таким образом, по умолчанию существует предел данных, которые могут быть внутри канала (записаны, но еще не прочитаны) в любой данный момент.По умолчанию это 64 КБ в Linux.Если канал заполнен, и ваш сценарий пытается выполнить запись, запись блокируется.Итак, ваш скрипт на самом деле не работает, в какой-то момент он остановился при write()
вызове .
Как это преодолеть?Корректировка значений по умолчанию - плохая опция;вместо этого используется выделение буфера в считывателе, чтобы он считывал данные в буфер, освобождая канал и, таким образом, позволяя программе записи работать, но показывая вам (или обрабатывает) только часть вывода.less
имеет такой буфер и, по умолчанию, расширяет его автоматически, однако он не заполняет его в фоновом режиме, он заполняет его только при чтении ввода.
Так что бы решитьпроблема заключается в чтении файла до конца (как обычно вы нажимаете G ), а затем возвращении к началу (как обычно вы нажимаете g ).Дело в том, что вы можете указывать эти команды через командную строку следующим образом:
./script | less +Gg
Однако вы должны заметить, что вам придется ждать, пока весь вывод скрипта загрузится в память, поэтому вы не будетебыть в состоянии просмотреть это сразу.less
недостаточно сложен для этого.Но если это именно то, что вам действительно нужно (просматривая начало вывода, пока ./script
все еще вычисляет его конец), вы можете использовать временный файл:
./script >x & less x ; rm x