Линукс, Vim, LaTeX, полезные скрипты, визуализация данных, численные расчёты, немного ФП

20090825

Как отслеживать изменения файлов в скриптах

Задача: отслеживать в скриптах изменения файла или файлов и выполнять какие-нибудь команды, когда файлы изменяются.

Пример: пересобирать документ LaTeX при изменении (сохранении) одного из исходных файлов.

Решение: остлеживать изменения можно с помощью утилит inotify-tools. Одна утилита, inotifywait ждёт указанных изменений и после этого завершается с тем или иным кодом возврата. Если произошло ожидаемое событие, код возврата 0 (успех). Именно inotifywait и используется в моём примере ниже. Другая утилита, inotifywatch, наблюдает за файлами и собирает информацию об изменениях, на выходе выводит табличку того, что заметила. Примеры применения этой утилиты смотрите на сайте inotify-tools, там же есть и дополнительные примеры использования inotifywait.

Пример использования: в данном случае я предполагаю, что все исходные файлы документа LaTeX лежат в текущем каталоге, а для сборки достаточно использовать pdflatex и bibtex. Вечный цикл: ждём любых изменений файлов текста или библиографии (первая команда цикла), в случае успеха (обнаруженных изменений) исполняем все нужные команды сборки документа (вторая команда цикла).
while true ; do \
inotifywait *.tex *.bib \
&& ( pdflatex -interaction=nonstopmode mypaper && \
bibtex mypaper && \
pdflatex -interaction=nonstopmode mypaper ) \
done

Естественно, применять можно для чего угодно, не только для LaTeX.

P.S. Вариант запуска LaTeX с опцией -interaction=nonstopmode позволяет с одной стороны избежать запроса интерактивного ввода в случае ошибки компиляции, а с другой стороны, позволяет эти ошибки компиляции всё же увидеть.

P.P.S. Рецепт работает только в линуксе. Для *BSD есть библиотечка pnotify и kqueue.

9 коммент.:

  1. есть еще pnotify, который поддерживает помимо Linux еще и BSD http://mark.heily.com/pnotify

    ОтветитьУдалить
  2. Спасибо. А для pnotify есть какие-нибудь утилитки вроде inotify-tools?

    ОтветитьУдалить
  3. inotify исключительно Linux'овое, в BSD используется kqueue.

    ОтветитьУдалить
  4. А почему бы не использовать incron?

    ОтветитьУдалить
  5. Можно и incron, если отслеживать изменения надо постоянно. Правда, он тоже, кажется, только для линукс (завязан на inotify).

    ОтветитьУдалить
  6. как насчет Makefiles + sleep ? :)

    ОтветитьУдалить
  7. Да, while true ; do sleep 5 ; make ; done тоже сработает, но не сразу. С inotify приятно, что сразу.

    ОтветитьУдалить
  8. а чем не устраивают make и ему подобные?

    ОтветитьУдалить
  9. СТраННое,

    make и ему подобные устраивают, но они решают другую задачу — как и что сделать.

    inotifywait позволяет определить, когда делать что-либо. Пример с LaTeX — просто пример.

    Для примера подошло бы и inotifywait ... && make

    ОтветитьУдалить