GNU/Linux >> Znalost Linux >  >> Linux

Jak `méně` bere data ze Stdin, zatímco je stále schopen číst příkazy od uživatele?

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.


Linux
  1. Jak vyměnit vadný pevný disk v softwarovém RAID systému Linux

  2. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

  3. Jak namapovat zařízení /dev/sdX a /dev/mapper/mpathY ze zařízení /dev/dm-Z

  1. Jak zaměníte /dev/sda s /dev/sdb?

  2. Jak Linux používá /dev/tty a /dev/tty0

  3. Jak zkontrolovat, zda je stdin /dev/null z shellu?

  1. Jak vygenerovat náhodné heslo v linuxu pomocí /dev/random

  2. Linux:Rozdíl mezi /dev/console, /dev/tty a /dev/tty0?

  3. Proč jsou < nebo > vyžadovány pro použití /dev/tcp