问题
I used to use fswatch v0.0.2 like so (in this instance to run django test suit when a file changed)
$>fswatch . 'python manage.py 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 manage.py test
nor does this:
$>fswatch . | xargs -n1 'python manage.py test'
how can I do this without packaging up my command in a bash script?
回答1:
fswatch
documentation (either the Texinfo manual, or the wiki, or README) have examples of how this is done:
$ fswatch [opts] -0 path ... | xargs -0 -n1 -I{} your full command goes here
Pitfalls:
-0
: use it to make sure paths with newlines are interpreted correctly.-o
: use it to havefswatch
"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 forxargs
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.
回答2:
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 manage.py 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:
#!/bin/bash
(while read; do $@; done)
usage:
fswatch -r -o -e 'pyc' somepath | fswatch-do python manage.py test someapp.SomeAppTestCase
来源:https://stackoverflow.com/questions/25689589/how-to-run-fswatch-to-call-a-program-with-static-arguments