I want a quick and simple way to execute a command whenever a file changes. I want something very simple, something I will leave running on a terminal and close it whenever I'm finished working with that file.
Currently, I'm using this:
while read; do ./myfile.py ; done
And then I need to go to that terminal and press Enter, whenever I save that file on my editor. What I want is something like this:
while sleep_until_file_has_changed myfile.py ; do ./myfile.py ; done
Or any other solution as easy as that.
BTW: I'm using Vim, and I know I can add an autocommand to run something on BufWrite, but this is not the kind of solution I want now.
Update: I want something simple, discardable if possible. What's more, I want something to run in a terminal because I want to see the program output (I want to see error messages).
About the answers: Thanks for all your answers! All of them are very good, and each one takes a very different approach from the others. Since I need to accept only one, I'm accepting the one that I've actually used (it was simple, quick and easy-to-remember), even though I know it is not the most elegant.
watch -g
terminates when output of the command changes, e.g.:while :; do watch -gn .1 stat -c %Z file.tex && pdflatex -interaction batchmode file.tex && pkill -HUP mupdf; done
. Where:
evaluates totrue
and-n .1
runs the command (stat
) every 0.1 seconds.stat -c %Z
gives time file was last accessed. Downside is this can only be stopped with^Z
,kill %1
while :; do …; done
, I usually usewhile sleep 1; do …; done
. This way, I can easily^C
during thesleep
call. Plus, it avoids hogging the CPU by limiting the loop to run at most at 1Hz (adjustable by changing thesleep
parameters).