Можно ли подключить скрипт bash к файлу?

32

Я хочу, чтобы скрипт не работал, если не был изменен / удален определенный файл (или файл, созданный в определенной директории, или ...). Может ли это быть достигнуто элегантным способом? Самое простое, что приходит мне в голову - это цикл, который некоторое время спит, прежде чем снова проверять статус, но, может быть, есть более элегантный способ?

Тобиас Кинцлер
источник

Ответы:

34

В Linux вы можете использовать inotifyфункцию ядра . Инструменты для сценариев можно найти там: inotify-tools .

Пример использования из вики:

#!/bin/sh

EVENT=$(inotifywait --format '%e' ~/file1) # blocking without looping
[ $? != 0 ] && exit
[ "$EVENT" = "MODIFY" ] && echo 'file modified!'
[ "$EVENT" = "DELETE_SELF" ] && echo 'file deleted!'
# etc...
shellholic
источник
1
Большинство объединений имеют похожую функцию. К сожалению, у каждого есть свой интерфейс, и у многих нет API оболочки.
Жиль "ТАК - перестань быть злым"
4

Для программистов на Си есть API, называемый inotify .

Есть некоторые инструменты, которые его используют, например, incron и inotify-tools .

Mikel
источник
Потрясающе, вот и все. Ура Микел!
Пол Д. Уэйт
3

На самом деле есть: entr (1) будет запускать произвольные команды при изменении файлов, а также предоставляет возможность автоматической перезагрузки для перезапуска серверов приложений.

редактировать: несколько примеров

Перестройте, если исходные файлы изменились

$ find *.c | entr make

Запустите и автоматически перезагрузите тестовый сервер, если файлы изменятся

$ ls *.py | entr -r python main.py

Предоставление агента +/path/to/fifoпозволяет выполнять более сложные сценарии, инструктируя entrзапись имени каждого файла, который изменяется на именованный канал. Следующие файлы преобразуют файлы Markdown в текущем каталоге в HTML по мере их редактирования

$ ls *.md | entr +/tmp/notify &
$ while read F
> do
>   markdown2html $F
> done < /tmp/notify
eradman
источник
Интригующе, но странно. Итак ... он читает кучу имен файлов на стандартном вводе и запускает указанную команду при изменении одного из них?
tripleee
Выглядит интересно, спасибо! Есть ли способ entrпередать имя файла, который также изменился?
Тобиас Кинцлер
Начиная с версии 2.7, специальный /_ аргумент (в некоторой степени аналогичный $_ в Perl) заменяется именем первого измененного файла
eradman