Как упомянул Уильям Перселл , lessсчитывает нажатия клавиш пользователя из терминала. Он явно открывает /dev/ttyуправляющий терминал; это дает ему дескриптор файла, отдельный от стандартного ввода, из которого он может читать интерактивный ввод пользователя. При необходимости он может одновременно считывать данные со стандартного ввода. (Это может также написать напрямую в терминал при необходимости.)
Вы можете увидеть это, запустив
some_command | strace -o less.trace -e open,read,write less
Перемещайтесь по входу, выходите lessи смотрите на содержимое less.trace: вы увидите, что оно открыто /dev/tty, и прочитаете как из файлового дескриптора 0, так и из того, который был возвращен при его открытии /dev/tty(вероятно, 3).
Это обычная практика для программ, желающих убедиться, что они читают и пишут в терминал. Одним из примеров является SSH, например, когда он запрашивает пароль или фразу-пароль.
Как пояснил на Шили , если /dev/ttyне может быть открыт, lessбудет считываться из стандартной ошибки (дескриптор файла 2). lessИспользование /dev/ttyбыло введено в версии 177, выпущенной 2 апреля 1991 года.
При попытке запуска cat /dev/tty | less, как и предложил на Хаген фон Eitzen , lessпреуспеет в открытии , /dev/ttyно не получите никакой информации от него до тех пор , catзакрывает его. Таким образом, вы увидите пустой экран, и ничего больше, пока не нажмете, CtrlCчтобы убить cat(или убить его каким-либо другим способом); затем lessпокажет все, что вы ввели во время catработы, и позволит вам контролировать это.
lessчитает данные для отображения из stdin и читает команды из tty. Это разные вещи.