Visualizza l'output del comando nel cercapersone scorrevole
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 less
comando 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
Non uscire alla fine dell'ingresso
Per impostazione predefinita, less non esce automaticamente, solo se si utilizza il comando quit ( q
).
Se invochi less
con 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 -F
less 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:
less
potrebbe essere un alias di shell con opzioni. Verifica conalias less
.- Less legge le opzioni dalla variabile di ambiente
LESS
all'avvio. Verifica conecho $LESS
. - Less ha un file di configurazione. La sua posizione predefinita è
.less
nella tua home directory; questo può essere cambiato impostando la variabile d'ambienteLESSKEY
. Il formato del file è binario, ma se le opzioni sono impostate in questo modo,LESS
nel 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 utilitymore
, 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 F
e poi Ctrl+C
per 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' -R
opzione 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
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 -R
puoi 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=always
ottenere 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 build
opzione 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 bat
e 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 .