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ührensome_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.