Я ненавижу себя за то, что говорю это, но
Существует более одного способа cat
,
Под этим я подразумеваю стандартный ввод, а затем стандартный ввод.
Или есть чтение с клавиатуры (терминала),
а затем есть чтение с клавиатуры. Пытаться
less < afilename
Это работает так же, как
less afilename
что значит less
должен иметь какой-то способ чтения с клавиатуры
кроме чтения из стандартного ввода.
Вот еще одна команда, которая работает, даже если вы этого не ожидаете:
less afilename < /dev/null
смотреть на tty
команда ,
Он сообщает имя tty (терминала), подключенного к стандартному входу.
Это работает по телефону ttyname
функция библиотеки с аргументом 0
(файловый дескриптор стандартного ввода).
less
вероятно звонит ttyname(1)
получить имя tty (терминала), подключенного к стандартному выходу.
Затем он открывает этот tty для чтения и принимает от него команды.
Он не читает команды из стандартного ввода; это только для данных.
Так что у нас есть два квази-независимых процесса ( cat
а также less
) независимо (одновременно) чтение с клавиатуры
(то есть tty / терминал) на двух независимых файловых дескрипторах.
Это запутанная ситуация, и это что-то вроде «состояния гонки».
Я нахожу это несколько аналогичным операции пинбол ,
в котором есть много дорожек или дорожек, по которым может пройти мяч -
и это всегда занимает один ; это никогда не может занять больше, чем один. Так же,
когда несколько процессов читают с одного терминала одновременно,
каждая набранная строка (если терминал находится в режиме строки)
или каждый набранный символ (если терминал находится в символьном режиме)
идет ровно на один процесс.
И выбор произвольный, мало чем отличающийся от действия пинбола.
Он не полностью «случайный», не более чем случайное планирование процессов;
но это по сути непредсказуемо.
Итак, вот что происходит:
cat
читает со своего стандартного входа, который по умолчанию является терминалом,
и пишет в свой стандартный вывод, который является каналом для less
,
- В какой-то момент,
less
звонки ttyname(1)
,
получает имя терминала, на котором он включен, и открывает его для чтения.
less
читает данные, заполненные экраном (то есть 24 строки или что-то еще)
со своего стандартного ввода (труба)
и записывает его на стандартный вывод (терминал).
- Затем,
less
выдает :
подскажите, переводит терминал в символьный режим,
и начинает читать из терминала ( не со стандартного ввода).
- Итак, теперь у нас есть два процесса (
cat
а также less
)
чтение с терминала одновременно,
и феномен пинбола включается - персонажи (и / или линии)
что вы печатаете, перейдите либо cat
или же less
полу-случайно.
Если это идет к cat
записывается в трубу и less
трактует это как данные.
Если это идет к less
, это интерпретируется как less
команда.
Это не имеет никакого отношения к буферизации.
echo a|less
он говорит «конец» в конце, но не с cat | less, даже когда он поражает меньше, с cat | less, когда он поражает меньше, он показывает двоеточие для подсказки. Что, да, я думаю, означает, что есть больше на экране. как ты говоришь. Я думаю, что ответ Давидго о буферизации может объяснить это. Кстати, я замечаю, просто набравless<ENTER>
он не запрашивает стандартный ввод, поэтому интересно, что вы можете добавить к нему эхо / канал.