How to run fswatch to call a program with static arguments?

I used to use fswatch v0.0.2 like so (in this instance to run django test suit when a file changed)

$>fswatch . 'python test'

this works fine.

I wanted to exclude some files that were causing the test to run more than once per save (Sublime text was saving a .tmp file, and I suspect .pyc files were also causing this)

So I upgraded fswatch to enable the -e mode.

However the way fswatch has changed which is causing me troubles - it now accepts a pipe argument like so:

$>fswatch . | xargs -n1 program

I can't figure out how to pass in arguments to the program here. e.g. this does not work:

$>fswatch . | xargs -n1 python test

nor does this:

$>fswatch . | xargs -n1 'python test'

how can I do this without packaging up my command in a bash script?


fswatch documentation (either the Texinfo manual, or the wiki, or README) have examples of how this is done:

$ fswatch [opts] -0 -o path ... | xargs -0 -n1 -I{} your full command goes here


  • xargs -0, fswatch -0: use it to make sure paths with newlines are interpreted correctly.
  • fswatch -o: use it to have fswatch "bubble" all the events in the set into a single one printing only the number of records in the set.
  • -I{}: specifying a placeholder is the trick you missed for xargs interpreting correctly your command arguments in those cases where you do not want the record (in this case, since -o was used, the number of records in the set) to be passed down to the command being executed.
Posted on by Enrico M. Crisostomo

Alternative answer not fighting xargs' default reason for being - passing on the output as arguments to the command to be run.

fswatch . | (while read; do python test; done)

Which is still a bit wordy/syntaxy, so I have created a super simple bash script fswatch-do that simplifies things for me:

(while read; do "[email protected]"; done)


fswatch -r -o -e 'pyc' somepath | fswatch-do python test someapp.SomeAppTestCase

Posted on by Guy Bowden