less
überprüft, ob stdout
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 man some_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 rennst man 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). Die ioctl(2)
nutzt auf stdout
würde ENOTTY auf einem Nicht-Terminal zurückkehren, so dass es die nicht-Terminal Sachbearbeitung ohnehin nicht vermeiden kann. Wird less
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 tut echo foo | strace less
).
bash script.sh
,bash script.sh | cat
,bash script.sh > file
, und sehen , was Ausgabe , die Sie erhalten.