Segui una pipa usando meno?


25

Può meno seguire (premendo F) un input convogliato (in modo simile a un file)? Per un file su cui si sta scrivendo, il comando

less <file>

seguirà il file quando si preme F.

Ma se ho un comando che convoglia l'output direttamente in meno, in questo modo

command | less

premendo F non si farà nulla.

Quindi sembra che le pipe non possano essere seguite come i file possono? O forse ha a che fare con il comando anche scrivendo a STDERR? L'effetto che sto cercando di ottenere è sempre vedere l'ultimo output del comando: proprio come tenere premuto PageDown!

Un'osservazione correlata vale per G (vai alla fine): quando esegui il piping direttamente su less, non funzionerà.


Risposte:


21

Premendo Fo Gmarche lesscercare di raggiungere EOF ingresso. Se l'ingresso è una pipe, si lessblocca fino a quando la pipe non viene chiusa dall'altra parte (e non "non fa nulla").

Ciò può essere risolto salvando l'output del comando in un file temporaneo in background e quindi utilizzandolo come input per less:

command > /tmp/x &
less +F /tmp/x; kill %; rm /tmp/x

Non è possibile eseguire questa operazione lesssolo in; tuttavia, ammetto che sarebbe utile.


Se l'ingresso è un tubo, si lessblocca fino a quando il tubo non viene chiuso sull'altro lato . È una specie di affermazione fuorviante. Quello che succede è che meno chiamate readin modalità di blocco, in attesa di nuovi dati o di chiusura della pipe.
Piotr Dobrogost,

3
Dopo aver premuto F o G sull'ingresso pipe, lessnon solo viene letto un blocco, ma lo fa in un loop in attesa di EOF. E un EOF su un tubo accade solo se l'altro lato è chiuso.
mik,

3
Se lessaggiornasse lo schermo in quel loop, non ci sarebbe un problema. Il blocco della lettura ha poco a che fare con questo problema.
mik,

1
@Flow questo non è un blocco della domanda, ma semplicemente un'attesa che è prevista in questa situazione - un'attesa per più dati nel file quando viene raggiunto EOF (che non accadrà per un tubo chiuso, tra l'altro), o per un interruzione per uscire dalla modalità follow
mik,

1
@PiotrDobrogost con blocco della lettura lessnon sarebbe in grado di aggiornare lo schermo, se non ci sono dati; quando compaiono alcuni dati, il blocco della lettura lo restituirà e lesssarebbe in grado di aggiornare lo schermo senza un thread separato
mik

6

Può meno seguire (premendo F) un input convogliato (in modo simile a un file)?

Sì, a partire dalla versione 474. Tuttavia, non è ancora menzionato nelle note di rilascio di alcuna versione poiché al momento esiste un problema rimanente con questa funzionalità. Di seguito un commento del manutentore di meno - Mark Nudelman:

Per quanto riguarda il comando F sui tubi, anche questo è risolto in meno 474. Invece di cercare EOF, il comando F cerca la fine dell'input bufferizzato e inizia a leggere lì. Tuttavia, non è realmente utilizzabile perché quando si preme CTRL-C per interrompere il comando F, si interrompe il processo producendo output. Non sono sicuro di come risolverlo.

Fino a quando questo problema non viene risolto in meno si può risolvere il problema utilizzando le funzionalità della shell. Vedi la mia risposta a C'è un modo per uscire dalla modalità follow "less" senza arrestare altri processi in pipe? domanda per i dettagli.

Per riferimento, il problema con F che non funziona con le pipe ha il numero di riferimento 300 nell'elenco di bug noti ed è intitolato Il comando F non funziona sull'input pipato.


Un'osservazione correlata vale per G (vai alla fine): quando esegui il piping direttamente su less, non funzionerà.

Funziona a partire dalla versione 466. Citando le note di rilascio per questa versione:

Il nuovo comando ESC-G arriva alla fine dei dati attualmente bufferizzati in una pipe


Il comando ESC-G è stato introdotto nella versione 466, rilasciata il 23 agosto 2014.
mik,

@mik Sembra quindi un errore nelle note di rilascio per la versione 471. Grazie, risolto.
Piotr Dobrogost,

Non un errore, elencano solo le modifiche in modo incrementale da una versione stabile, versione 458 in questo caso. Tuttavia, non esiste un rilascio stabile con il comando ESC-G.
mik,

Il comando ESC-G è ora in una versione stabile (481): "16 ott 2015 less-481 è stato rilasciato per uso generale".
Mik

Aggiornamento: per quanto riguarda il comando F sui tubi, anche questo è stato risolto in meno 474. Invece di cercare EOF, il comando F cerca la fine dell'input bufferizzato e inizia a leggere lì. Tuttavia, non è realmente utilizzabile perché quando si preme ctrl-C per interrompere il comando F, si interrompe il processo producendo output. Non sono sicuro di come risolverlo. - Mark Nudelman, manutentore di meno
Piotr Dobrogost

2

Dalla pagina man meno

[Keyboard] COMMANDS [...]

   F      Scroll  forward, and keep trying to read when the end of file is reached.  Normally this command would be used when already
          at the end of the file.  It is a way to monitor the tail of a file which is growing while it is being viewed.  (The  behav‐
          ior is similar to the "tail -f" command.)

quindi dovrebbe funzionare e funziona davvero per me.


1
Questo comando si comporta diversamente se usato con pipe come descritto da @mik e chiaramente non è ciò che OP sta cercando.
Piotr Dobrogost,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.