# *nix tips

## 2009-08-26

### Monitor file changes in a shell script

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.

Прочесть по-русски