Cuando utilizo less file1 file2, obtengo los dos archivos que se muestran en el "visor de menos búfer", pero less file1 file2 | catimprime 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.stdoutno es algo que se pueda "escribir en un archivo". Es algo que debeswrite()hacer .lessno 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).lessno se "da cuenta" de lo quecatsigue. Simplemente se comporta comocatsi fuera lo siguiente, si es stdout no es un tty.lessseguirí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.lesscomprueba sistdoutes un terminal y se comporta comocatcuando 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,
--helpsalida) a lalessvez que permite una fácil redirección a un archivo. Sería un asco sisome_command --fullhelp > help.txttodaví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.lessEl comportamiento de gato es útil si olvida editarlo de una sola línea al agregar más etapas a una tubería también.lessnecesita averiguar las dimensiones del terminal (tamaño de la pantalla, para saber cuántas líneas mostrar a la vez). Elioctl(2)que usastdoutdevolvería ENOTTY en un no terminal, por lo que no puede evitar manejar el caso no terminal de todos modos.lessen realidad se usaisatty(3)antes de verificar las dimensiones del terminal, peroisattyfunciona 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/ttypara la entrada de teclado. (Puedes verlo hacer esto conecho foo | strace less).fuente