it-swarm.com.de

Wie nimmt "weniger" 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 praktisch, Langtext mit less anzuzeigen:

some_command | less

Jetzt ist sein Standard mit einer Pipe (FIFO) verbunden. Wie kann es noch Befehle wie up/down/quit lesen?

47
iBug

Wie von William Pursell erwähnt, liest less 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. Bei Bedarf kann es gleichzeitig Daten lesen, um sie von seinem Standardeingang anzuzeigen. (Bei Bedarf kann auch direkt in das Terminal geschrieben werden.)

Sie können dies durch Ausführen sehen

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

Bewegen Sie sich um die Eingabe herum, beenden Sie less und sehen Sie sich den Inhalt von less.trace An: Sie werden sehen, dass /dev/tty Geöffnet ist und sowohl aus dem Dateideskriptor 0 als auch aus dem jeweils beschriebenen gelesen wird wurde zurückgegeben, als es geöffnet wurde /dev/tty (wahrscheinlich 3).

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

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

Wenn Sie versuchen, cat /dev/tty | less Wie vorgeschlagen von Hagen von Eitzen auszuführen, kann less/dev/tty Erfolgreich öffnen, hat aber gewonnen Keine Eingabe erhalten, bis cat es schließt. Sie sehen also den Bildschirm leer und nichts anderes, bis Sie drücken CtrlC cat töten (oder auf andere Weise töten); dann zeigt less alles an, was Sie eingegeben haben, während cat ausgeführt wurde, und ermöglicht es Ihnen, es zu steuern.

52
Stephen Kitt

UNIX bietet zwei Methoden zum Lesen von Benutzereingaben, während stdin umgeleitet wurde:

  • Die ursprüngliche Methode besteht darin, aus stderr zu lesen. Stderr ist offen für das Schreiben nd Lesen und dies wird immer noch in POSIX erwähnt.

  • Spätere UNIX-Versionen haben (um 1979) ein /dev/tty Treiberschnittstelle, über die die Steuerung eines Prozesses geöffnet werden kann. Da es Prozesse ohne Controlling gibt, ist es möglich, dass ein Versuch, /dev/tty schlägt fehl. Freundlich geschriebene Software greift daher auf die ursprüngliche Methode zurück und versucht dann, von stderr zu lesen.

27
schily