less
comprueba si stdout
es un terminal y se comporta como cat
cuando no lo es (copia stdin en stdout hasta EOF).
Esta característica le permite escribir secuencias de comandos o programas que siempre envían su salida (por ejemplo, --help
salida) a la less
vez que permite una fácil redirección a un archivo. Sería un asco si some_command --fullhelp > help.txt
todavía esperara la barra espaciadora en stdin para paginar el texto, o algo así. Algunos comandos (por ejemplo man
) verifican que su propia salida decida si enviar su salida a través de un localizador o no. Si corres man ls > ls.txt
, nunca invoca tu $PAGER
.
less
El comportamiento de gato es útil si olvida editarlo de una sola línea al agregar más etapas a una tubería también.
less
necesita averiguar las dimensiones del terminal (tamaño de la pantalla, para saber cuántas líneas mostrar a la vez). El ioctl(2)
que usa stdout
devolvería ENOTTY en un no terminal, por lo que no puede evitar manejar el caso no terminal de todos modos. less
en realidad se usa isatty(3)
antes de verificar las dimensiones del terminal, pero isatty
funciona probando un ioctl solo tty y verificando la falta de error.
Incluso un buscapersonas simple como more(1)
(al menos la versión util-linux) tiene esta característica, porque probablemente sea el comportamiento sensato más simple de implementar para ese caso.
Tenga en cuenta que cuando algo tubería en less
(por ejemplo grep foo bar.txt | less
), se tiene que abrir /dev/tty
para la entrada de teclado. (Puedes verlo hacer esto con echo foo | strace less
).
bash script.sh
,bash script.sh | cat
,bash script.sh > file
, y ver lo que la producción que se obtiene.