Wie die meisten von Ihnen es schon oft getan haben, ist es praktisch, Langtext anzuzeigen, indem Sie Folgendes verwenden less
:
some_command | less
Jetzt ist sein Standard mit einer Pipe (FIFO) verbunden. Wie kann es noch Befehle wie up / down / quit lesen?
less
Liest die anzuzeigenden Daten von stdin und liest Befehle vom tty. Sie sind verschiedene Dinge.less
Liest Daten aus stdin und Befehle aus dem tty.Antworten:
Liest, wie von William Pursell erwähnt ,
less
die Tastatureingaben des Benutzers vom Terminal. Es öffnet sich explizit/dev/tty
das steuernde Terminal; Das gibt ihm einen von der Standardeingabe getrennten Dateideskriptor, aus dem er die interaktiven Eingaben des Benutzers lesen kann. Es kann bei Bedarf gleichzeitig Daten von seiner Standardeingabe lesen, um sie anzuzeigen. (Es könnte auch schreiben direkt an das Endgerät , falls erforderlich.)Sie können dies durch Laufen sehen
Bewegen Sie sich durch die Eingabe, beenden Sie sie
less
und sehen Sie sich den Inhalt vonless.trace
: an. Sie sehen, dass sie geöffnet/dev/tty
ist und lesen sowohl den Dateideskriptor 0 als auch denjenigen, der beim Öffnen zurückgegeben wurde/dev/tty
(wahrscheinlich 3).Dies ist gängige Praxis für Programme, die sicherstellen möchten, dass sie vom Terminal lesen und auf das Terminal schreiben. Ein Beispiel dafür ist SSH, zB wenn es nach einem Passwort oder Passwort fragt.
Wie von schily erklärt, wird , wenn es nicht geöffnet werden kann, von seinem Standardfehler gelesen (Dateideskriptor 2). Die Verwendung von wurde in Version 177 eingeführt, die am 2. April 1991 veröffentlicht wurde.
/dev/tty
less
less
/dev/tty
Wenn Sie versuchen , laufen
cat /dev/tty | less
, wie vorgeschlagen von Hagen von Eitzen ,less
wird in der Öffnung gelingt/dev/tty
aber nicht jede Eingabe von ihr bis bekommencat
schließt es. Sie sehen also den Bildschirm leer und nichts anderes, bis Sie drücken CtrlC, um zu tötencat
(oder auf andere Weise zu töten ); Anschließendless
wird angezeigt, was Sie währendcat
der Ausführung eingegeben haben , und Sie können es steuern.quelle
cat blah |
dass er durch ersetzt werden kann< blah
, und selbst das ist in diesem Fall unnötig, da es auchless blah
funktioniert ( na jaless -f /dev/tty
). Das Auslesen/dev/tty
ist jedoch ein Sonderfall, und alle drei Varianten (cat /dev/tty | less
,less < /dev/tty
undless -f /dev/tty
) führen zu unterschiedlichen Ergebnissen./dev/tty
und/dev/pts/...
.UNIX bietet zwei Methoden zum Lesen von Benutzereingaben, während stdin umgeleitet wurde:
Die ursprüngliche Methode ist, aus stderr zu lesen . Stderr ist zum Schreiben und Lesen geöffnet und dies wird in POSIX noch erwähnt.
In späteren UNIX-Versionen (um 1979) wurde eine
/dev/tty
Treiberoberfläche hinzugefügt , mit der die Steuerung eines Prozesses geöffnet werden kann. Da es Prozesse ohne Steuerung gibt, ist es möglich, dass ein Öffnungsversuch/dev/tty
fehlschlägt. Freundlich geschriebene Software greift daher auf die ursprüngliche Methode zurück und versucht dann, aus stderr zu lesen.quelle
dup()
Lizenzen derselben Dateibeschreibung waren, jedoch alle auf dem tty geöffnet waren. (Anscheinend erfordert oder schlägt POSIX immer noch vor (diese Antwort sagt nichts), dass stderr eine Lese- / Schreib-FD ist, die nicht mit so etwas wie geöffnet wirdopen("/dev/ttyS0", O_WRONLY)
. Das Lesen von stderr würde in diesem Fall fehlschlagen.)