Wenn ich es verwende less file1 file2
, werden beide Dateien im "less buffer viewer" angezeigt, aber less file1 file2 | cat
der Inhalt beider Dateien wird an stdout angehängt. Woher weiß weniger, ob es den "less buffer viewer" anzeigen oder eine Ausgabe an stdout für einen nächsten Befehl erzeugen soll? Welcher Mechanismus wird dazu verwendet?
21
bash script.sh
,bash script.sh | cat
,bash script.sh > file
, und sehen , was Ausgabe , die Sie erhalten.stdout
kann nicht in eine Datei geschrieben werden. Es ist etwas , das Siewrite()
zu .less
Es muss nichts anders gemacht werden, je nachdem, ob es sich bei der Ausgabe um eine Datei, eine Pipe, einen Socket oder ein Block-Gerät handelt oder was auch immer. Es ist nur wichtig, dass es kein tty ist, also verhält es sich einfach socat
. (Ich nehme an, Sie wussten das und wählten nur die falschen Wörter, um es zu erklären, aber ich dachte, ich würde dies für andere Leser herausstellen).less
findet" nicht heraus, wascat
als nächstes kommt. Es verhält sich einfach so,cat
unabhängig davon, wie es weitergeht, wenn es kein tty ist.less
dies mit einem TCGETS möglich ist, um die Terminaldimensionen zu ermitteln oder festzustellen, dass es sich nicht um eine Tty handelt, aber anscheinend habe ich falsch geraten.less
überprüft, obstdout
es sich um ein Terminal handelt und verhält sich so,cat
als wäre es nicht vorhanden (kopiert stdin nach stdout bis EOF).Mit dieser Funktion können Sie Skripte oder Programme schreiben, die ihre Ausgabe immer senden (z. B.
--help
Ausgabe),less
während die einfache Umleitung in eine Datei weiterhin möglich ist. Es wäre scheiße, wenn mansome_command --fullhelp > help.txt
immer noch darauf warten würde, dass die Leertaste auf stdin durch den Text blättert oder so. Einige Befehle (z. B.man
) prüfen die eigene Ausgabe, um zu entscheiden, ob die Ausgabe über einen Pager gesendet wird oder nicht. Wenn du rennstman ls > ls.txt
, ruft es niemals deine$PAGER
.less
Das katzeähnliche Verhalten von ist praktisch, wenn Sie vergessen, es aus einem Einzeiler heraus zu bearbeiten, wenn Sie einer Pipeline auch mehr Stufen hinzufügen.less
muss die Terminalabmessungen ermitteln (Bildschirmgröße, um zu wissen, wie viele Zeilen gleichzeitig angezeigt werden sollen). Dieioctl(2)
nutzt aufstdout
würde ENOTTY auf einem Nicht-Terminal zurückkehren, so dass es die nicht-Terminal Sachbearbeitung ohnehin nicht vermeiden kann. Wirdless
tatsächlich verwendet,isatty(3)
bevor die Terminalabmessungen überprüft werden.isatty
Dies funktioniert jedoch, indem ein reines tty-ioctl ausgeführt und auf Fehlerfreiheit überprüft wird.Sogar ein einfacher Pager wie
more(1)
(zumindest die Util-Linux-Version) hat diese Funktion, da es wahrscheinlich das einfachste vernünftige Verhalten ist, das für diesen Fall implementiert werden kann.Beachten Sie, dass beim Pipe- In
less
(z. B.grep foo bar.txt | less
) etwas/dev/tty
für die Tastatureingabe geöffnet werden muss. (Sie können sehen, dass es dies mit tutecho foo | strace less
).quelle