![Как использовать команду watch с конвейерной цепочкой команд/программ](https://rvso.com/image/97221/%D0%9A%D0%B0%D0%BA%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%83%20watch%20%D1%81%20%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D0%B9%D0%B5%D1%80%D0%BD%D0%BE%D0%B9%20%D1%86%D0%B5%D0%BF%D0%BE%D1%87%D0%BA%D0%BE%D0%B9%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%2F%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC.png)
Я обычно использую 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
команду работать с конвейерной цепочкой команд [кроме помещения их в скрипт]?
решение1
watch 'command | othertool | yet-another-tool'
решение2
watch -n 1 "ls -lrt | tail -n20; date"
давайте вы трубите и бегите в ряд.
решение3
Используйте комбинацию одинарных кавычек ( '
) и двойных кавычек ( "
). Например:
watch -n 1 "links -dump 127.0.0.1/server-status | grep -e '\S' -Fe 'www.'"
решение4
Предположим, вы запустили команду, а затем хотите ее просмотреть. Используйте:
ls -lrt | tail -n20; date
watch "!!"