Вывод программы трубопровода на меньшее не показывает начало вывода

Я пытаюсь make объединить файлы в моем каталоге, но файлы генерируют ~ 200 строк ошибок, поэтому они слишком быстро пролетают мимо моего терминала, и я должен прокручивать их, чтобы прочитать их.

Я хотел бы передать вывод, который отображает на экране пейджер, который позволит мне прочитать ошибки, начиная с самого начала. Но когда я пытаюсь

make | less

less не отображает начало вывода - он отображает конец вывода, который обычно выводится на экран, а затем сообщает мне, что выход имеет длину 1 строку. Когда я пытаюсь ввести Gg, единственная строка на экране - это строка исполняемого файла makefile, и обычный выход на экран исчезает.

Я неправильно использую less? Я никогда раньше не использовал его, и у меня возникают подобные проблемы с чем-то вроде sh myscript.sh | less, где он не сразу отображает начало выходного файла.

Ответы

Ответ 1

Ошибки из make появляются в стандартном потоке ошибок (stderr в C), который не перенаправляется обычными трубами. Если вы хотите, чтобы он перенаправлялся на less, вам нужно либо make |& less (csh, и т.д.), Либо make 2>&1 | less (sh, bash и т.д.).

Ответ 2

Выход ошибки отправляется в несколько другое место, которое не попадает на обычные конвейеры, поскольку вы часто хотите видеть ошибки, но не смешивать их с данными, которые вы собираетесь обрабатывать дальше. Для таких вещей вы используете перенаправление:

$ make 2>&1 | less

В bash и zshcsh/tcsh, из которого они взяли его) это можно сократить до

$ make |& less

С такими вещами, как make, которые подвержены большому количеству ошибок, я захочу проверить позже, я обычно записываю вывод в файл, а затем less этот файл позже:

$ make |& tee make.log
$ less make.log