I usually user watch linux utility to watch the output of a command repeatedly every n seconds, like in watch df -h /some_volume/

But I seem not to be able to use watch with a piped series of command like:

$ watch ls -ltr|tail -n 1

If I do that, watch is really watching ls -ltr and the output is being passed to tail -n 1 which doesn't output anything.

If I try this:

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

I get

$ watch: syntax error near unexpected token `ls'

And any of the following fails some reason or another:

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

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

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

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

And finally if do this:

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

I see no change in the output at the given interval because the command inside $() is run just once and the resulting output string is always printed ("watched") as a literal.

So, how do I make the watch command work with a piped chain of commands [other that putting them inside a script]?

  • run man watch and scroll down to examples... – don_crissti Oct 25 '16 at 17:57
watch 'command | othertool | yet-another-tool'
  • 1
    Might be worth noting the generic approach as well watch sh -c 'command | etc' particularly looking at the approaches tried in the question. – sourcejedi Oct 25 '16 at 18:08
  • @sourcejedi I haven't really figured out why, but this won't always produce the same results. – Michael Mior Oct 16 '18 at 1:25
watch -n 1 "ls -lrt | tail -n20; date"

let's you pipe and run in a row.

  • what is -n 1 for? – Nam G VU Mar 8 at 4:50
  • 1
    @NamGVU: Run the command every 1 second – Duc Tran Mar 13 at 18:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.