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.