Входное поведение Stdin между “кошкой” и “меньше”

[115173] Это должно сработать:[12117]
1
08.01.2015, 00:00
2 ответа

less запускает следующий код, когда ему не даны аргументы по имени файла:

if (isatty(fd0))
{
    error("Missing filename (\"less --help\" for help)", NULL_PARG);
    quit(QUIT_OK);
}
return (edit("-"));

Он жалуется, когда стандартным входом является терминал. Если стандартный вход является обычным файлом или трубкой, то это нормально.

Предположительно, он делает это, потому что ему нужно читать ответы из терминала в конце каждой страницы, и не будет возможности отличить данные, которые загружаются, от ответов.

Это не упоминается в man-странице. Может быть, так и должно быть.

cat не выводит свою страницу и не считывает ответы из терминала. Он не имеет никаких ограничений, поскольку stdin является терминалом.

6
27.01.2020, 23:11

Полагаю, что минус вызывает isatty(3) по файловому дескриптору 0. Другой вариант - вызвать fstat(2) по файловому дескриптору 0 и интерпретировать значения полей st_ino и st_rdev. В любом случае, дело в том, что программа может что-то сказать о файловом дескрипторе, а stdin - это просто файловый дескриптор 0.

Поскольку меньше выходит и cat нет, то нужно посмотреть на назначение этих двух разных программ. меньше - это GNU-пейджер, реакция на BSD-пейджер больше (обратите внимание на панно). Не совсем понятно, что имеет смысл пагинация входного сигнала от терминала, но, возможно, имеет смысл пагинация входного сигнала от трубы. Или может быть stdin. Кодирование особого случая в минус имеет смысл. Кодирование специального случая в cat не имеет смысла и уменьшает его полезность. Еще в конце 1980-х годов люди имели оконные системы и набирали cat > somefile, а затем вставляли большой кусок текста в "somefile".

4
27.01.2020, 23:11

Теги

Похожие вопросы