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
и посмотреть , что вывод , который вы получите.