Jako většina z vás už mnohokrát, je vhodné prohlížet dlouhý text pomocí less
:
some_command | less
Nyní je jeho stdin připojen k potrubí (FIFO). Jak může stále číst příkazy jako up/down/quit?
Přijatá odpověď:
Jak zmínil William Pursell, less
čte stisknuté klávesy uživatele z terminálu. Explicitně otevře /dev/tty
, ovládací terminál; to mu dává deskriptor souboru, oddělený od standardního vstupu, ze kterého může číst interaktivní vstup uživatele. Může současně číst data k zobrazení ze svého standardního vstupu v případě potřeby. (Mohlo by to také zapsat v případě potřeby přímo do terminálu.)
Můžete to vidět spuštěním
some_command | strace -o less.trace -e open,read,write less
Pohybujte se po vstupu, ukončujte less
a podívejte se na obsah less.trace
:uvidíte jej otevřené /dev/tty
a číst z obou deskriptorů souboru 0 a podle toho, který byl vrácen při otevření /dev/tty
(pravděpodobně 3).
To je běžná praxe pro programy, které chtějí zajistit, že čtou z terminálu a zapisují do něj. Jedním z příkladů je SSH, např. když požádá o heslo nebo přístupovou frázi.
Jak vysvětlil schily, pokud /dev/tty
nelze otevřít, less
bude číst ze své standardní chyby (deskriptor souboru 2). less
použití /dev/tty
byl představen ve verzi 177, vydané 2. dubna 1991.
Pokud zkusíte spustit cat /dev/tty | less
, jak navrhuje Hagen von Eitzen, less
podaří otevřít /dev/tty
ale nezíská z něj žádný vstup, dokud cat
zavře to. Takže dokud nestisknete Ctrl, uvidíte prázdnou obrazovku a nic jiného C zabít cat
(nebo ho zabít jiným způsobem); pak less
zobrazí vše, co jste napsali při cat
byl spuštěn a umožňuje vám jej ovládat.