lessпроверяет, stdoutявляется ли он терминалом, и ведет себя так, как catесли бы это не было (копирует стандартный ввод в стандартный вывод до EOF).
Эта функция позволяет вам писать скрипты или программы, которые всегда отправляют свои выходные данные (например, --helpвыходные данные), в lessто же время позволяя легко перенаправить файл. Было бы плохо, если бы some_command --fullhelp > help.txtвсе еще ждали пробел на stdin, чтобы пролистать текст или что-то еще. Некоторые команды (например man) проверяют свой собственный вывод, чтобы решить, отправлять ли свой вывод через пейджер или нет. Если вы бежите man ls > ls.txt, он никогда не вызывает вашу $PAGER.
lessПодобное кошке поведение удобно, если вы забыли отредактировать его из однострочного текста при добавлении дополнительных этапов в конвейер.
lessНужно выяснить размеры терминала (размер экрана, узнать, сколько строк показывать одновременно). ioctl(2)Он использует по stdoutвернется ENOTTY на нетерминале, так что он не может избежать обработок нетерминального дела в любом случае. lessфактически использует isatty(3)перед проверкой размеров терминала, но isattyработает, используя to-only ioctl и проверяя отсутствие ошибок.
Даже такой простой пейджер more(1)(по крайней мере, версия util-linux) имеет эту функцию, потому что это, вероятно, простейшее вменяемое поведение для реализации в этом случае.
Обратите внимание, что когда вы что-то передаете less (например grep foo bar.txt | less), оно должно открываться /dev/ttyдля ввода с клавиатуры. (Вы можете видеть это с этим echo foo | strace less).
bash script.sh,bash script.sh | cat,bash script.sh > fileи посмотреть , что вывод , который вы получите.