entr is is what I eventually settled on after years of searching the perfect utility to build/run tests after file changes. After using gulp, grunt, watching_testrunner (which I eventually inherited maintainership of), watchman, watchdog (<a href="https://github.com/gorakhargosh/watchdog" rel="nofollow">https://github.com/gorakhargosh/watchdog</a>), sniffer (<a href="https://github.com/jeffh/sniffer" rel="nofollow">https://github.com/jeffh/sniffer</a>)<p>entr is cross-platform on OS X, linux <i>and</i> BSD.<p>watching_testrunner has no BSD support<p>watchman is way too big and not domain specific enough to my needs<p>sniffer worked quite well but it required having a scent.py file everywhere<p>entr keeps it all in a neat, unix like package you can pipe files to.<p>I keep some example usage in my book, <i>The Tao of tmux</i> at <a href="https://leanpub.com/the-tao-of-tmux/read#leanpub-auto-file-watching" rel="nofollow">https://leanpub.com/the-tao-of-tmux/read#leanpub-auto-file-w...</a>. In this section I demonstrate my workflow with entr(1) in a Makefile. The code I use in the example should work across OS X / BSD / Linux (note the utilities like find(1) may behave a bit differently across unix-like systems).<p>I use the Makefile w/ entr(1) in development on my projects like tmuxp at <a href="https://github.com/tony/tmuxp/blob/master/Makefile" rel="nofollow">https://github.com/tony/tmuxp/blob/master/Makefile</a>. tmuxp is BSD-licensed so you're free to work off that if you'd like to try it on your own project.