GNU/Linux >> Linux Esercitazione >  >> Linux

In che modo `meno` prende i dati da Stdin mentre è ancora in grado di leggere i comandi dall'utente?

Come molti di voi hanno fatto molte volte, è conveniente visualizzare il testo lungo utilizzando less :

some_command | less

Ora il suo stdin è collegato a una pipe (FIFO). Come può ancora leggere comandi come su/giù/chiudi?

Risposta accettata:

Come accennato da William Pursell, less legge le sequenze di tasti dell'utente dal terminale. Apre esplicitamente /dev/tty , il terminale di controllo; che gli fornisce un descrittore di file, separato dallo standard input, dal quale può leggere l'input interattivo dell'utente. Può leggere simultaneamente i dati da visualizzare dal suo input standard, se necessario. (Potrebbe anche scrivere direttamente al terminale, se necessario.)

Puoi vederlo accadere eseguendo

some_command | strace -o less.trace -e open,read,write less

Spostati intorno all'input, esci less e guarda il contenuto di less.trace :lo vedrai aperto /dev/tty , e leggi sia dal descrittore di file 0 che da quello che è stato restituito quando ha aperto /dev/tty (probabilmente 3).

Questa è una pratica comune per i programmi che desiderano assicurarsi di leggere e scrivere sul terminale. Un esempio è SSH, es. quando richiede una password o una passphrase.

Come spiegato da schily, se /dev/tty non può essere aperto, less leggerà dal suo errore standard (descrittore di file 2). less uso di /dev/tty è stato introdotto nella versione 177, rilasciata il 2 aprile 1991.

Se provi a eseguire cat /dev/tty | less , come suggerito da Hagen von Eitzen, less riuscirà ad aprire /dev/tty ma non riceverà alcun input da esso fino a cat lo chiude. Quindi vedrai lo schermo vuoto e nient'altro finché non premi Ctrl C per uccidere cat (o uccidilo in qualche altro modo); quindi less mostrerà tutto ciò che hai digitato mentre cat era in esecuzione e ti consente di controllarlo.


Linux
  1. Come generare una password casuale in Linux usando /dev/random

  2. Quanto sono portatili /dev/stdin, /dev/stdout e /dev/stderr?

  3. Come mappare il dispositivo /dev/sdX e /dev/mapper/mpathY dal dispositivo /dev/dm-Z

  4. Come codificare in base64 /dev/random o /dev/urandom?

  5. Come si scambia /dev/sda con /dev/sdb?

tty (/dev/tty ) vs pts (/dev/pts) in Linux

Come scoprire da quale cartella è in esecuzione un processo?

DD da /dev/zero a /dev/null... cosa succede realmente

Come Linux usa /dev/tty e /dev/tty0

echo o print /dev/stdin /dev/stdout /dev/stderr

Come verificare se stdin è /dev/null dalla shell?