Visualizza l'output del comando nel cercapersone scorrevole

Aug 23 2020

Vorrei visualizzare l'output di un comando dall'alto e impedire al terminale di saltare giù, e vorrei un modo indipendente dal terminale per farlo. Quindi senza modificare la configurazione specifica del terminale. Ho provato a usare il lesscomando in questo modo:

command | less

tuttavia sui comandi che ho usato, il cercapersone esce al termine dell'output del comando.

Come ottengo il comportamento in cui l'output del comando viene trasmesso in streaming nel cercapersone in tempo reale, ma posso visualizzarlo dall'alto verso il basso?

Risposte

6 Gilles'SO-stopbeingevil' Aug 23 2020 at 03:08

Non uscire alla fine dell'ingresso

Per impostazione predefinita, less non esce automaticamente, solo se si utilizza il comando quit ( q).

Se invochi lesscon l'opzione -E, esce quando raggiunge la fine del file. Con l'opzione -e, esce quando provi a spostarti oltre la fine del file (ad esempio scorrendo ripetutamente). Con l'opzione -Fless esce immediatamente se il file è visualizzato interamente su una schermata. Nessuna di queste opzioni è abilitata per impostazione predefinita, ma ci sono alcuni modi in cui possono essere rese predefinite sul tuo sistema:

  • lesspotrebbe essere un alias di shell con opzioni. Verifica con alias less.
  • Less legge le opzioni dalla variabile di ambiente LESSall'avvio. Verifica con echo $LESS.
  • Less ha un file di configurazione. La sua posizione predefinita è .lessnella tua home directory; questo può essere cambiato impostando la variabile d'ambiente LESSKEY. Il formato del file è binario, ma se le opzioni sono impostate in questo modo, LESSnel file appariranno sia la stringa che le opzioni.
  • È improbabile, ma se la variabile di ambiente LESS_IS_MOREè impostata, less si comporta come la vecchia utility more, inclusa l'uscita alla fine del file per impostazione predefinita.

Visualizzazione dell'output del comando prima che sia terminato

Quando convogli l'input di un comando in less ( mycommand | less), less continua a leggere finché il comando non è terminato. Puoi interrompere less con Ctrl+C, ma non sarai in grado di leggere ulteriori output dal comando e il comando potrebbe morire a causa di un tubo rotto. Questo perché less chiude la pipe quando smette di leggere.

Una soluzione alternativa per questo è rendere l'output del comando su un file e chiamare less su quel file. Quando less sta leggendo da un file, puoi digitare Fe poi Ctrl+Cper fargli leggere più dati dal file, quindi continuare a navigare.

mycommand >log 2>&1 &
less log

I programmi possono avere un comportamento leggermente diverso a seconda che il loro output sia un terminale, una pipe o un file. Se trovi che l'output è ritardato quando l'output è un file o una pipe anziché un terminale, ciò è dovuto all'output buffering . Vedere disattivare il buffering nella pipe

L' scriptutilità esegue un programma in un terminale virtuale e registra l'intero output in un file. Per quanto riguarda il programma, sta scrivendo l'output su un terminale. Il programma può utilizzare sequenze di escape del colore, ad esempio. Passa l' -Ropzione a less per fargli passare le sequenze di escape del terminale al terminale piuttosto che mostrare i caratteri di controllo in forma di escape.

script -c 'mycommand --option || echo "mycommand failed with status $?"' mycommand.log </dev/null >/dev/null &
less -R mycommand.log
1 stimulate Aug 24 2020 at 06:42

Il problema era che non ho reindirizzato l'output di stderr a less, per qualche motivo:

command 2>&1 | less 

produce il comportamento desiderato.

usando less -Rpuoi preservare l'output colorato reindirizzato da command, ma alcuni comandi omettono automaticamente la colorazione quando il loro output viene reindirizzato e devi cercare un'opzione come --color=alwaysottenere sempre output colorato.

Nel mio caso, ora reindirizzo il mio output a bat, che è un clone di cat, con più funzionalità, con le opzioni --paging=always, --pager="less -RFX"e --number, e utilizzo l' cargo buildopzione s --color=always:

cargo build --color=always 2>&1 | bat --paging=always --pager="less -RFX" --number

Il che produce un output piacevole, scorrevole e colorato con righe numerate:

   1    Compiling openlimits v0.1.0 (/home/####/git/openlimits)
   2 error[E0433]: failed to resolve: use of undeclared type or module `tokio`
   3   --> src/binance/client/websocket.rs:15:5
   4    |
   5 15 | use tokio::net::TcpStream;
   6    |     ^^^^^ use of undeclared type or module `tokio`
   7
   8 error[E0433]: failed to resolve: use of undeclared type or module `tokio_tungstenite`
   9   --> src/binance/client/websocket.rs:16:5
  10    |
  11 16 | use tokio_tungstenite::{
  12    |     ^^^^^^^^^^^^^^^^^ use of undeclared type or module `tokio_tungstenite`
  13
  14 error[E0433]: failed to resolve: use of undeclared type or module `tokio`
  15   --> src/coinbase/client/websocket.rs:10:5
  16    |
  17 10 | use tokio::net::TcpStream;
  18    |     ^^^^^ use of undeclared type or module `tokio`
  19
....

Quindi inserisco le opzioni nei miei file di configurazione per bate cargo, per renderle implicite, e ora ottengo questo comportamento durante la digitazione

cargo build 2>&1 | bat

In bash, apparentemente puoi usare &>invece di 2>&1. Sono equivalenti. In zsh, questo non sembra funzionare, sebbene sia documentato in questo modo .