GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie nimmt `less` Daten von stdin, während es dennoch in der Lage ist, Befehle vom Benutzer zu lesen?

Wie die meisten von Ihnen schon oft getan haben, ist es bequem, langen Text mit less anzuzeigen :

some_command | less

Jetzt ist seine stdin mit einer Pipe (FIFO) verbunden. Wie kann es noch Befehle wie hoch/runter/beenden lesen?

Akzeptierte Antwort:

Wie von William Pursell erwähnt, less liest die Tastenanschläge des Benutzers vom Terminal. Es öffnet explizit /dev/tty , das steuernde Terminal; Dadurch erhält es einen von der Standardeingabe getrennten Dateideskriptor, aus dem es die interaktive Eingabe des Benutzers lesen kann. Er kann bei Bedarf gleichzeitig Daten zur Anzeige von seiner Standardeingabe lesen. (Es könnte auch schreiben bei Bedarf direkt an das Terminal.)

Sie können dies sehen, indem Sie

ausführen
some_command | strace -o less.trace -e open,read,write less

Bewegen Sie sich um die Eingabe, beenden Sie less , und sehen Sie sich den Inhalt von less.trace an :Sie werden sehen, dass es /dev/tty öffnet , und lesen Sie sowohl den Dateideskriptor 0 als auch den zurück, der beim Öffnen von /dev/tty zurückgegeben wurde (wahrscheinlich 3).

Dies ist gängige Praxis für Programme, die sicherstellen möchten, dass sie vom Terminal lesen und in das Terminal schreiben. Ein Beispiel ist SSH, z. B. wenn es nach einem Passwort oder einer Passphrase fragt.

Wie von Schily erklärt, wenn /dev/tty kann nicht geöffnet werden, less liest aus seinem Standardfehler (Dateideskriptor 2). less Verwendung von /dev/tty wurde in Version 177 eingeführt, die am 2. April 1991 veröffentlicht wurde.

Wenn Sie versuchen, cat /dev/tty | less , wie von Hagen von Eitzen vorgeschlagen, less erfolgreich beim Öffnen von /dev/tty bekommt aber bis cat keine Eingaben davon schließt es. Sie sehen also den Bildschirm leer und sonst nichts, bis Sie Strg drücken C um cat zu töten (oder es auf andere Weise töten); dann less zeigt, was Sie während cat eingegeben haben ausgeführt wurde, und Sie können es steuern.


Linux
  1. So generieren Sie ein zufälliges Passwort unter Linux mit /dev/random

  2. Linux:Unterschied zwischen /dev/console , /dev/tty und /dev/tty0?

  3. Linux – Wie unterscheidet sich der /proc//exe Symlink von gewöhnlichen Symlinks?

  4. So ordnen Sie /dev/sdX- und /dev/mapper/mpathY-Geräte vom /dev/dm-Z-Gerät zu

  5. Wie kann /dev/random oder /dev/urandom mit base64 codiert werden?

tty (/dev/tty ) vs. pts (/dev/pts) unter Linux

Wann sollte ich /dev/shm/ verwenden und wann sollte ich /tmp/?

DD von /dev/zero nach /dev/null ... was eigentlich passiert

Wie Linux /dev/tty und /dev/tty0 verwendet

echo oder print /dev/stdin /dev/stdout /dev/stderr

Warum sind < oder > erforderlich, um /dev/tcp