Como la mayoría de ustedes ha hecho muchas veces, es conveniente ver texto largo usando less
:
some_command | less
Ahora su stdin está conectado a una tubería (FIFO). ¿Cómo puede seguir leyendo comandos como arriba/abajo/salir?
Respuesta aceptada:
Como menciona William Pursell, less
lee las pulsaciones de teclas del usuario desde el terminal. Abre explícitamente /dev/tty
, el terminal de control; eso le da un descriptor de archivo, separado de la entrada estándar, desde el cual puede leer la entrada interactiva del usuario. Puede leer simultáneamente datos para mostrar desde su entrada estándar si es necesario. (También podría escribir directamente a la terminal si es necesario).
Puedes ver que esto suceda ejecutando
some_command | strace -o less.trace -e open,read,write less
Muévase por la entrada, salga less
y mira el contenido de less.trace
:lo verás abierto /dev/tty
, y lea tanto el descriptor de archivo 0 como el que se devolvió cuando abrió /dev/tty
(probablemente 3).
Esta es una práctica común para los programas que desean asegurarse de que están leyendo y escribiendo en la terminal. Un ejemplo es SSH, p. ej. cuando solicita una contraseña o frase de contraseña.
Como explica Schily, si /dev/tty
no se puede abrir, less
leerá de su error estándar (descriptor de archivo 2). less
El uso de /dev/tty
se introdujo en la versión 177, lanzada el 2 de abril de 1991.
Si intenta ejecutar cat /dev/tty | less
, como sugiere Hagen von Eitzen, less
logrará abrir /dev/tty
pero no obtendrá ninguna entrada hasta que cat
lo cierra Entonces verá la pantalla en blanco y nada más hasta que presione Ctrl C matar a cat
(o matarlo de alguna otra manera); entonces less
mostrará lo que hayas escrito mientras cat
se estaba ejecutando y te permite controlarlo.