Bare bones files watch

Sometimes I just need to follow the changes to files and act upon that. There are plenty of "watchers" out there, like Guard and Watchr, but if I really don't want to drag the bag of gems, here's what I do:

#!/bin/zsh

typeset -a pids

tidy()  
{
    for pid in $pids
    do
        kill $pid

    done
}

trap tidy INT

(fswatch -e '#' lib test web | xargs -I anything -R 1 -L 1 -t mix test)&
pids=($!)

(fswatch -0 src/coffee | xargs -0 -n 1 -I _ sh -c "cat src/coffee/* | coffee --compile --stdio > priv/static/js/application.js")&
pids+=$!

wait

The original is by Dave Thomas and was posted in an Elixir user group thread.

We define a function that will terminate our background tasks on INT signal, then start two watchers and add their PIDs to the list. Finally, we wait.

Now to the fswatch command syntax. (Mac OS X users can install this tool with brew install fswatch.) The tool is pretty handy. It watches for changes in the given file / directory and sends notifications. In the first example, we just watch for notifications in code directories and run mix test for each noticed change. In the second, we watch for changes in src/coffee and then run the CoffeeScript compiler along with concatenation of the files.

Easy, bare bones and plenty of opportunities. Explore.

comments powered by Disqus