Como usar o comando watch com uma cadeia de comandos / programas canalizada

51

Eu costumo usar o watchutilitário linux para assistir a saída de um comando repetidamente a cada n segundos, como emwatch df -h /some_volume/

Mas parece que não consigo usar watchcom uma série de comandos canalizada como:

$ watch ls -ltr|tail -n 1

Se eu fizer isso, watchestá realmente assistindo ls -ltre a saída está sendo passada para a tail -n 1qual não produz nada.

Se eu tentar isso:

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

eu recebo

$ watch: syntax error near unexpected token `ls'

E qualquer uma das seguintes falhas falha por algum motivo ou outro:

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

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

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

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

E finalmente, se fizer isso:

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

Não vejo alteração na saída no intervalo especificado, porque o comando interno $()é executado apenas uma vez e a sequência de saída resultante é sempre impressa ("assistida") como um literal.

Então, como faço para que o watchcomando funcione com uma cadeia de comandos canalizada [outra que os coloque dentro de um script]?

Tulains Córdova
fonte
executar man watche desça até exemplos ...
don_crissti

Respostas:

82
watch 'command | othertool | yet-another-tool'
DopeGhoti
fonte
11
Pode valer a pena notar a abordagem genérica, bem como, watch sh -c 'command | etc'particularmente, as abordagens tentadas na questão.
sourcejedi
@sourcejedi Eu realmente não descobri o porquê, mas isso nem sempre produz os mesmos resultados.
Michael Mior 16/10
12
watch -n 1 "ls -lrt | tail -n20; date"

vamos cantar e correr em uma fileira.

Soft Dot IE
fonte
o que é -n 1para?
Nam G VU
2
@NamGVU: Execute o comando a cada 1 segundo
Duc Tran
2

Se você desejar listar todos os arquivos nos subdiretórios também, poderá usar o comando find com a opção exec.

watchserá atualizado a cada 30 segundos e findpesquisará todos os arquivos * .log no diretório atual (subdiretórios incluídos) e imprimirá os nomes de arquivos e suas últimas 10 linhas:

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