![Поведение ввода Stdin между «cat» и «less»](https://rvso.com/image/36024/%D0%9F%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B2%D0%B2%D0%BE%D0%B4%D0%B0%20Stdin%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%C2%ABcat%C2%BB%20%D0%B8%20%C2%ABless%C2%BB.png)
Когда я выдаю cat
, терминал зависает в ожидании ввода stdin. Однако когда less
выдается , я получаю Missing filename ("less --help" for help)
. Известно, что less
и cat
принимает ввод stdin. В чем разница? Как это отражено в man-страницах?
решение1
less
запускает следующий код, когда ему не указаны аргументы имени файла:
if (isatty(fd0))
{
error("Missing filename (\"less --help\" for help)", NULL_PARG);
quit(QUIT_OK);
}
return (edit("-"));
Он жалуется, когда стандартный ввод — это терминал. Если стандартный ввод — это обычный файл или канал, то с этим все в порядке.
Вероятно, это происходит потому, что в конце каждой страницы необходимо считывать ответы с терминала, и нет возможности отличить данные, которые выгружаются, от ответов.
Об этом не упоминается на странице руководства. Может быть, так и должно быть.
cat
не разбивает вывод на страницы и не читает ответы с терминала. У него нет никаких ограничений, поскольку stdin является терминалом.
решение2
Я предполагаю, что это less
вызовы isatty(3)
файлового дескриптора 0. Другой альтернативой было бы вызвать fstat(2)
файловый дескриптор 0 и интерпретировать значения полей st_ino
и st_rdev
. В любом случае, суть в том, что программа может что-то сказать о файловом дескрипторе, а stdin — это просто файловый дескриптор 0.
Что касается того, почему less
завершается, а cat
почему нет, вам нужно посмотреть на назначение двух разных программ. less
— это пейджер GNU, реакция на пейджер BSD more
(обратите внимание на каламбурное название). Не совсем имеет смысла разбивать на страницы ввод с терминала, но может иметь смысл разбивать на страницы ввод с конвейера. Любой из них может быть stdin. Кодирование особого случая в less
имеет смысл. Кодирование особого случая в cat
не имеет смысла и снижает его полезность. Даже в конце 1980-х годов у людей были оконные системы, и они печатали, cat > somefile
а затем вставляли большой кусок текста в «somefile».