Need help with watch?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

430 Stars 25 Forks 45 Commits 5 Opened issues


watch(1) periodically executes the given command - useful for auto-testing, auto-building, auto-anything

Services available


Need anything else?

Contributors list

No Data


A tiny C program used to periodically execute a command.


Usage: watch [options] 


-q, --quiet only output stderr -x, --halt halt on failure -i, --interval interval in seconds or ms defaulting to 1 -v, --version output version number


$ make install

Or in your local bin (

$ PREFIX=~ make install


This project is very similar to original watch(1) implemented in 1991, differences include:

  • ansi escape sequences (colors etc)
  • terminal is not cleared
  • lower default interval of 1s
  • millisecond interval resolution

Milliseconds resolution

This version of

support millisecond resolution with the
$ watch -i 300ms echo hey


would be seconds:
$ watch -i 300 echo hey


Watch is pretty handy, here are a few use-cases:

Running tests

Ad-hoc mtime watchers are annoying to construct, and have relatively no purpose when you can simply execute your tests at a regular interval. For example run

as a job, running tests each second (or a second after the program exits):
$ watch make test &
[1] 3794
✔ bifs.components
✔ bifs.dark
✔ bifs.darken
✔ bifs.image-size

Your tests will happily chug away, when you want to stop watch simply foreground the job and ^C:

$ fg

Auto-build CSS / JS etc

Need to build CSS or JavaScript dependencies? use a Makefile. With the large quantity of copy-cats (Rake,Jake,Sake,Cake...) people seem to be forgetting that Make is awesome, if you take a little bit of time to learn it you'll love it (or at least most of it). Make will utilize

and only build what's necessary, this is great.

Let's say we had some Jade templates, even some nested in sub-directories, we could list them in a Makefile quite easily.

Below JADE is a list constructed by the shell command

find templates -name "*.jade"
, which is usually a lot easier to manage than listing these files manually, which is also valid, and sometimes important of ordering is relevant. Following that we have HTML which simply substitutes ".jade" with ".html", giving us our HTML targets.
JADE = $(shell find templates -name "*.jade")
HTML = $(JADE:.jade=.html)

Our first target is

, becoming the default target for
. On the right-hand side of this we specify the dependencies, which in this case is a list of all of our HTML files, not yet built. Make will see this and execute the
targets, which allows use to use the
executable to translate the dependency on the right of
, to the target on the left.
JADE = $(shell find templates -name "*.jade")
HTML = $(JADE:.jade=.html)

all: $(HTML)

%.html: %.jade jade < $< > [email protected]

Now we can build all of these files with a single command

$ make
jade < templates/bar.jade > templates/bar.html
jade < templates/baz/raz.jade > templates/baz/raz.html
jade < templates/foo.jade > templates/foo.html

We can also add a

pseudo-target to remove the compiled files with
make clean
. Here it's listed to the right of
, telling make that it does not expect a file named
on the fs, so it wont compare mtimes etc. Make is smart about re-executing these actions, if you
again you'll notice that since none of the dependencies have changed it'll simply tell you "make: Nothing to be done for `all'.".
JADE = $(shell find templates -name "*.jade")
HTML = $(JADE:.jade=.html)

all: $(HTML)

%.html: %.jade jade < $< > [email protected]

clean: rm -f $(HTML)

.PHONY: clean

The one missing component is periodical action, which is where

or similar utilities come in, this functionality coupled with Make as a build system creates a powerful duo.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.