![Comportamiento de entrada estándar entre "cat" y "less"](https://rvso.com/image/36024/Comportamiento%20de%20entrada%20est%C3%A1ndar%20entre%20%22cat%22%20y%20%22less%22.png)
Cuando emito cat
, el terminal se bloquea esperando la entrada estándar. Sin embargo, cuando less
se emite, obtengo Missing filename ("less --help" for help)
. Se sabe que ambos less
y cat
aceptan entradas estándar. ¿Cuál es la diferencia? ¿Cómo se refleja esto en las páginas de manual?
Respuesta1
less
ejecuta 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.
cat
no 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 less
llama 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_ino
y 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é less
sale y cat
no, es necesario analizar el propósito de los dos programas diferentes. less
es 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 less
tiene sentido. Codificar un caso especial cat
no 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 > somefile
luego pegaba una gran cantidad de texto en "algún archivo".