
Я обычно использую 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 "!!"