Cómo usar el comando watch con una cadena de comandos / programas canalizados

52

Usualmente watchutilizo la utilidad Linux para ver la salida de un comando repetidamente cada n segundos, como enwatch df -h /some_volume/

Pero parece que no puedo usar watchuna serie de comandos canalizados como:

$ watch ls -ltr|tail -n 1

Si hago eso, watchrealmente está mirando ls -ltry la salida se está pasando a la tail -n 1que no sale nada.

Si intento esto:

$ watch (ls -ltr|tail -n 1)

yo obtengo

$ watch: syntax error near unexpected token `ls'

Y cualquiera de los siguientes falla alguna razón u otra:

$ watch <(ls -ltr|tail -n 1)

$ watch < <(ls -ltr|tail -n 1)

$ watch $(ls -ltr|tail -n 1)

$ watch `ls -ltr|tail -n 1)`

Y finalmente si haces esto:

$ watch echo $(ls -ltr|tail -n 1)

No veo ningún cambio en la salida en el intervalo dado porque el comando dentro $()se ejecuta solo una vez y la cadena de salida resultante siempre se imprime ("vigilada") como literal.

Entonces, ¿cómo hago que el watchcomando funcione con una cadena de comandos canalizada [aparte de ponerlos dentro de un script]?

Tulains Córdova
fuente
corre man watchy desplázate hacia abajo para ver ejemplos ...
don_crissti

Respuestas:

83
watch 'command | othertool | yet-another-tool'
DopeGhoti
fuente
1
Podría valer la pena señalar el enfoque genérico, así como watch sh -c 'command | etc'observar particularmente los enfoques probados en la pregunta.
sourcejedi
@sourcejedi Realmente no he descubierto por qué, pero esto no siempre producirá los mismos resultados.
Michael Mior
12
watch -n 1 "ls -lrt | tail -n20; date"

vamos a canalizar y correr en fila.

Soft Dot IE
fuente
lo que es -n 1para?
Nam G VU
2
@NamGVU: Ejecutar el comando cada 1 segundo
Duc Tran
2

Si desea enumerar todos los archivos en subdirectorios también, puede usar el comando find con la opción exec.

watchse actualizará cada 30 segundos y findbuscará todos los archivos * .log en el directorio actual (incluidos los subdirectorios) e imprimirá los nombres de archivo y sus últimas 10 líneas:

watch -n30 'find . -name "*.log" -print -exec tail -n10 {} \; '
yoyomanYo
fuente