GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo `less` toma datos de Stdin mientras aún puede leer comandos del usuario?

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.


Linux
  1. Linux:¿Diferencia entre /dev/console, /dev/tty y /dev/tty0?

  2. Linux:¿Qué significa la letra 'u' en /dev/urandom?

  3. Cómo mapear dispositivos /dev/sdX y /dev/mapper/mpathY desde el dispositivo /dev/dm-Z

  4. ¿Cómo codificar en base64 /dev/random o /dev/urandom?

  5. ¿Cómo se intercambia /dev/sda con /dev/sdb?

Cómo reemplazar un disco duro fallido en el software RAID de Linux

tty (/dev/tty) vs pts (/dev/pts) en Linux

DD de /dev/zero a /dev/null... lo que realmente sucede

Cómo usa Linux /dev/tty y /dev/tty0

hacer eco o imprimir /dev/stdin /dev/stdout /dev/stderr

¿Por qué se requieren < o > para usar /dev/tcp?