Чи може сценарій 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 оболонки.
Жил "ТАК - перестань бути злим"

4

Існує API, який називається inotify для програмістів на C.

Є деякі інструменти, які використовують його, наприклад, інструменти incron і inotify .


Чудово, ось це. Привіт Мікель!
Пол Д. Уейт

3

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

редагувати: кілька прикладів

Перебудуйте, якщо файли джерел змінюються

$ find *.c | entr make

Запустіть і автоматично перезавантажте тестовий сервер, якщо файли змінюються

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

Надання agument +/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.