Comportamiento de entrada estándar entre "cat" y "less"

Comportamiento de entrada estándar entre "cat" y "less"

Cuando emito cat, el terminal se bloquea esperando la entrada estándar. Sin embargo, cuando lessse emite, obtengo Missing filename ("less --help" for help). Se sabe que ambos lessy cataceptan entradas estándar. ¿Cuál es la diferencia? ¿Cómo se refleja esto en las páginas de manual?

Respuesta1

lessejecuta el siguiente código cuando no se le proporciona ningún argumento de nombre de archivo:

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

Se queja cuando la entrada estándar es un terminal. Si la entrada estándar es un archivo o canalización normal, está bien.

Presumiblemente hace esto porque necesita leer las respuestas del terminal al final de cada página, y no habría forma de distinguir los datos que se paginan y las respuestas.

Esto no se menciona en la página de manual. Quizás debería serlo.

catno pagina su salida y no lee las respuestas del terminal. No tiene ninguna restricción en cuanto a que stdin sea una terminal.

Respuesta2

Supongo que lessllama isatty(3)al descriptor de archivo 0. Otra alternativa sería llamar fstat(2)al descriptor de archivo 0 e interpretar los valores de los campos st_inoy st_rdev. De cualquier manera, el punto es que un programa puede decir algo sobre un descriptor de archivo, y la entrada estándar es solo el descriptor de archivo 0.

En cuanto a por qué lesssale y catno, es necesario analizar el propósito de los dos programas diferentes. lesses el buscapersonas GNU, una reacción al buscapersonas BSD more(tenga en cuenta el nombre puny). No tiene exactamente sentido paginar la entrada desde una terminal, pero podría tener sentido paginar la entrada desde una tubería. Cualquiera de los dos podría ser estándar. Codificar un caso especial lesstiene sentido. Codificar un caso especial catno tiene sentido y reduce su utilidad. Incluso a finales de la década de 1980, la gente tenía sistemas de ventanas y escribía y cat > somefileluego pegaba una gran cantidad de texto en "algún archivo".

información relacionada