¿Seguir una tubería usando menos?

25

¿Puede seguir menos (presionando F) una entrada canalizada (de manera similar a un archivo)? Para un archivo en el que se está escribiendo, el comando

less <file>

seguirá el archivo al presionar F.

Pero si tengo un comando que canaliza la salida directamente en menos, como este

command | less

presionar F no hará nada.

Entonces, ¿parece que las tuberías no se pueden seguir como los archivos? ¿O tal vez tiene que ver con el comando que también escribe en STDERR? El efecto que estoy tratando de lograr es ver siempre la última salida del comando: ¡al igual que mantener presionado PageDown!

Una observación relacionada es válida para G (ir al final): cuando se canaliza directamente a menos, no funcionará.

haelix
fuente

Respuestas:

21

Al pulsar Fo Gmarcas lessintentar alcanzar EOF entrada. Si la entrada es una tubería, se lesscuelga hasta que la tubería se cierra del otro lado (y no "no hace nada").

Esto puede solucionarse guardando el resultado del comando en un archivo temporal en segundo plano y luego usándolo como entrada para less:

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

No hay opción para hacer esto lesssolo; Sin embargo, admito que sería útil.

mik
fuente
Si la entrada es una tubería, se lesscuelga hasta que la tubería se cierra del otro lado . Esa es una especie de declaración engañosa. Lo que sucede es que hay menos llamadas readen modo de bloqueo, esperando nuevos datos o el cierre de la tubería.
Piotr Dobrogost
3
Después de presionar F o G en la entrada de tubería, lessno solo se realiza una lectura de bloqueo, sino que se realiza en un bucle esperando EOF. Y un EOF en una tubería ocurre solo si su otro lado está cerrado.
mik
3
Si lessactualizaría la pantalla en ese bucle, no habría problema. Bloquear la lectura tiene poco que ver con este problema.
mik
1
@Flow, esto no es un problema sobre el que se trató la pregunta, sino simplemente una espera que se espera en esta situación: una espera para obtener más datos en el archivo cuando se alcanza EOF (por cierto, lo que no sucederá para una tubería cerrada), o para una interrupción para salir del modo de seguimiento
mik
1
@PiotrDobrogost con bloqueo de lectura lessno podría actualizar la pantalla, si no hay datos; cuando aparezcan algunos datos, el bloqueo de lectura los devolverá y lesspodría actualizar la pantalla sin un hilo separado
mik
6

¿Puede seguir menos (presionando F) una entrada canalizada (de manera similar a un archivo)?

Sí, comenzando con la versión 474. Sin embargo, aún no se menciona en las notas de la versión de ninguna versión, ya que actualmente hay un problema pendiente con esta característica. A continuación se muestra un comentario del responsable de less - Mark Nudelman:

Con respecto al comando F en tuberías, esto también se corrige en less-474. En lugar de buscar EOF, el comando F busca el final de la entrada almacenada en el búfer y comienza a leer allí. Sin embargo, no es realmente utilizable porque cuando presiona CTRL-C para detener el comando F, mata el proceso que produce la salida. No estoy seguro de cómo solucionar eso.

Hasta que este problema se solucione en menos, uno puede solucionarlo utilizando las funciones de shell. Vea mi respuesta a ¿Hay alguna forma de salir del modo de seguimiento "menos" sin detener otros procesos en la tubería? pregunta para más detalles.

Como referencia, el problema con F que no funciona con tuberías tiene el número de referencia 300 en la lista de errores conocidos y se titula El comando F no funciona en la entrada canalizada.


Una observación relacionada es válida para G (ir al final): cuando se canaliza directamente a menos, no funcionará.

Funciona a partir de la versión 466. Citando las notas de la versión de esta versión:

El nuevo comando ESC-G va al final de los datos almacenados actualmente en una tubería

Piotr Dobrogost
fuente
El comando ESC-G se introdujo en la versión 466, lanzada el 23 de agosto de 2014.
mik
@mik Parece un error en las notas de la versión 471 entonces. Gracias, arreglado.
Piotr Dobrogost
No es un error, simplemente enumeran los cambios de forma incremental desde una versión estable, la versión 458 en este caso. Sin embargo, no hay una versión estable con el comando ESC-G.
mik
El comando ESC-G ahora está en una versión estable (481): "16 de octubre de 2015, menos-481 ha sido lanzado para uso general".
mik
Actualización: Con respecto al comando F en tuberías, esto también se corrige en less-474. En lugar de buscar EOF, el comando F busca el final de la entrada almacenada y comienza a leer allí. Sin embargo, no es realmente utilizable porque cuando presiona ctrl-C para detener el comando F, mata el proceso que produce la salida. No estoy seguro de cómo solucionar eso. - Mark Nudelman, mantenedor de less
Piotr Dobrogost
2

Desde la página de menos man

[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.)

así que esto debería funcionar, y realmente funciona para mí.

artistoex
fuente
1
Este comando se comporta de manera diferente cuando se usa con tubería como lo describe @mik y claramente no es lo que OP está buscando.
Piotr Dobrogost el