Как использовать команду watch с конвейерной цепочкой команд / программ


52

Я обычно watchпользуюсь утилитой linux для просмотра вывода команды несколько раз каждые n секунд, как вwatch df -h /some_volume/

Но мне кажется, что я не могу использовать watchс такой последовательной командой, как:

$ watch ls -ltr|tail -n 1

Если я делаю это, watchдействительно смотрю, ls -ltrи вывод передается, tail -n 1который ничего не выводит.

Если я попробую это:

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

я получил

$ watch: syntax error near unexpected token `ls'

И любое из следующих действий не выполняется по той или иной причине:

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

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

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

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

И, наконец, если сделать это:

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

Я не вижу изменений в выходных данных в заданном интервале, потому что команда внутри $()запускается только один раз, и результирующая выходная строка всегда печатается («просматривается») как литерал.

Итак, как мне заставить watchкоманду работать с конвейерной цепочкой команд [кроме того, что помещать их в сценарий]?


запустить man watchи прокрутить вниз к примерам ...
don_crissti

Ответы:


83
watch 'command | othertool | yet-another-tool'

1
Возможно, стоит отметить общий подход, watch sh -c 'command | etc'особенно если посмотреть на подходы, опробованные в этом вопросе.
sourcejedi

@sourcejedi Я не совсем понял, почему, но это не всегда дает одинаковые результаты.
Майкл Миор


2

Если вы также хотите перечислить все файлы в подкаталогах, вы можете использовать команду find с опцией exec.

watchбудет обновляться каждые 30 секунд и findбудет искать все файлы * .log в текущем каталоге (включая вложенные) и печатать имена файлов и их последние 10 строк:

watch -n30 'find . -name "*.log" -print -exec tail -n10 {} \; '
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.