Можно ли подключить скрипт 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...

1
Большинство объединений имеют похожую функцию. К сожалению, у каждого есть свой интерфейс, и у многих нет API оболочки.
Жиль "ТАК - перестань быть злым"


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

Интригующе, но странно. Итак ... он читает кучу имен файлов на стандартном вводе и запускает указанную команду при изменении одного из них?
tripleee

Выглядит интересно, спасибо! Есть ли способ entrпередать имя файла, который также изменился?
Тобиас Кинцлер

Начиная с версии 2.7, специальный /_ аргумент (в некоторой степени аналогичный $_ в Perl) заменяется именем первого измененного файла
eradman
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.