Problem: monitor file changes from a shell script and execute some commands when necessary. For example, rebuild LaTeX document or compile program every time when one of its source files is changed.
Solution: inotify-tools help to monitor file changes. There are two utilities. The first one, inotifywait
, blocks and waits for changes, then returns. If the event it was waiting for happened, its return code is 0
(success). See an example of using inotifywait
below. The second utility is inotifywatch
, it monitors files' changes, collects information and prints a nice table on exit. Please visit inotify-tools' site to see examples of its use.
Example: inotifywait
monitors all *.tex and *.bib files in the current directory, and when any of them changes, it runs pdfLaTeX and BibTeX to rebuild document:
while true ; do \ inotifywait *.tex *.bib \ && ( pdflatex -interaction=nonstopmode mypaper && \ bibtex mypaper && \ pdflatex -interaction=nonstopmode mypaper ) \ done
P.S. Please note that when we run LaTeX with -interaction=nonstopmode
, it does not ask questions on errors but we can still see those errors.
P.P.S. inotify-tools
run only on Linux. You may need to use pnotify or kqueue on *BSD.