Як використовувати команду watch з трубопровідним ланцюгом команд / програм


51

Зазвичай я користувачу 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

Відповіді:


82
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.