Cuando utilizo less file1 file2
, obtengo los dos archivos que se muestran en el "visor de menos búfer", pero less file1 file2 | cat
imprime el contenido de ambos archivos adjuntos a stdout. ¿Cómo sabe menos si debería mostrar el "visor de menos búfer" o producir resultados en stdout para un próximo comando? ¿Qué mecanismo se usa para hacer esto?
21
bash script.sh
,bash script.sh | cat
,bash script.sh > file
, y ver lo que la producción que se obtiene.stdout
no es algo que se pueda "escribir en un archivo". Es algo que debeswrite()
hacer .less
no tiene que hacer nada diferente dependiendo de si su salida es un archivo, tubería, socket o dispositivo de bloque, o lo que sea. Solo importa que no sea un tty, por lo que simplemente se comporta comocat
. (Supongo que lo sabías y elegiste las palabras incorrectas para explicarlo, pero pensé en señalarlo a otros lectores).less
no se "da cuenta" de lo quecat
sigue. Simplemente se comporta comocat
si fuera lo siguiente, si es stdout no es un tty.less
seguiría adelante y usaría un TCGETS para obtener las dimensiones de la terminal o descubriría que no es un tty, pero aparentemente adiviné mal.less
comprueba sistdout
es un terminal y se comporta comocat
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 laless
vez que permite una fácil redirección a un archivo. Sería un asco sisome_command --fullhelp > help.txt
todavía esperara la barra espaciadora en stdin para paginar el texto, o algo así. Algunos comandos (por ejemploman
) verifican que su propia salida decida si enviar su salida a través de un localizador o no. Si corresman 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). Elioctl(2)
que usastdout
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 usaisatty(3)
antes de verificar las dimensiones del terminal, peroisatty
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 ejemplogrep foo bar.txt | less
), se tiene que abrir/dev/tty
para la entrada de teclado. (Puedes verlo hacer esto conecho foo | strace less
).fuente