![Stdin-Eingabeverhalten zwischen „cat“ und „less“](https://rvso.com/image/36024/Stdin-Eingabeverhalten%20zwischen%20%E2%80%9Ecat%E2%80%9C%20und%20%E2%80%9Eless%E2%80%9C.png)
Wenn ich eingebe cat
, bleibt das Terminal hängen und wartet auf die Eingabe von stdin. Wenn jedoch less
ausgegeben wird, erhalte ich Missing filename ("less --help" for help)
. Es ist bekannt, dass sowohl als less
auch cat
stdin-Eingaben akzeptieren. Was ist der Unterschied? Wie wird dies in den Manpages wiedergegeben?
Antwort1
less
führt den folgenden Code aus, wenn keine Dateinamenargumente angegeben sind:
if (isatty(fd0))
{
error("Missing filename (\"less --help\" for help)", NULL_PARG);
quit(QUIT_OK);
}
return (edit("-"));
Es beschwert sich, wenn die Standardeingabe ein Terminal ist. Wenn die Standardeingabe eine normale Datei oder Pipe ist, ist das in Ordnung.
Dies geschieht vermutlich, weil am Ende jeder Seite die Antworten vom Terminal gelesen werden müssen und es keine Möglichkeit gäbe, zwischen den ausgelagerten Daten und den Antworten zu unterscheiden.
Dies wird auf der Manpage nicht erwähnt. Vielleicht sollte es das.
cat
gibt seine Ausgabe nicht aus und liest keine Antworten vom Terminal. Es gibt keine Einschränkungen, da stdin ein Terminal ist.
Antwort2
Ich vermute, dass dies auf Dateideskriptor 0 less
abzielt . Eine andere Alternative wäre , Dateideskriptor 0 aufzurufen und die Werte der Felder und zu interpretieren . In jedem Fall ist der Punkt, dass ein Programm etwas über einen Dateideskriptor sagen kann und stdin einfach Dateideskriptor 0 ist.isatty(3)
fstat(2)
st_ino
st_rdev
Was die Gründe für das less
Beenden und cat
das Nichtbeenden betrifft, müssen Sie sich den Zweck der beiden unterschiedlichen Programme ansehen. less
ist der GNU-Pager, eine Reaktion auf den BSD-Pager more
(beachten Sie den witzigen Namen). Es macht nicht unbedingt Sinn, Eingaben von einem Terminal zu paginieren, aber es könnte durchaus Sinn machen, Eingaben von einer Pipe zu paginieren. Beides könnte stdin sein. Das Codieren eines Sonderfalls in less
macht Sinn. Das Codieren eines Sonderfalls in cat
macht keinen Sinn und verringert seine Nützlichkeit. Sogar in den späten 1980er Jahren hatten die Leute Fenstersysteme und tippten cat > somefile
einen großen Textblock ein und fügten ihn dann in „somefile“ ein.