Когда я использую, less file1 file2
я получаю оба файла, показанные в «меньшем буфере просмотра», но less file1 file2 | cat
печатает содержимое обоих файлов, добавленных в стандартный вывод. Как less узнает, должен ли он отображать «менее просмотрщик буфера» или выводить в stdout для следующей команды? Какой механизм используется для этого?
21
bash script.sh
,bash script.sh | cat
,bash script.sh > file
и посмотреть , что вывод , который вы получите.stdout
это не то, что можно записать в файл. Это то, что вамwrite()
нужно .less
не нужно ничего делать по-разному, в зависимости от того, является ли его вывод файлом, каналом, сокетом или блочным устройством, или чем-то еще. Имеет значение только то, что это не tty, поэтому он просто ведет себя какcat
. (Я предполагаю, что вы знали это и просто выбрали неправильные слова, чтобы объяснить это, но я думал, что укажу это другим читателям).less
не "выяснить", чтоcat
будет дальше. Это просто ведет себя какcat
независимо от того, что это дальше, если это стандартный вывод не tty.less
можно пойти дальше и использовать один TCGETS, чтобы получить размеры терминала или обнаружить, что это не tty, но, видимо, я догадался неправильно.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
).источник