Как упомянул Уильям Перселл , 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. Это разные вещи.