Czy skrypt bash można podłączyć do pliku?

32

Chcę, aby skrypt był uśpiony, chyba że określony plik zostanie zmodyfikowany / usunięty (lub plik utworzony w określonym katalogu lub ...). Czy można to osiągnąć w elegancki sposób? Najprostsza rzecz, jaka przychodzi mi na myśl, to pętla, która śpi przez pewien czas, zanim ponownie sprawdzi status, ale może jest to bardziej elegancki sposób?

Tobias Kienzler
źródło

Odpowiedzi:

34

W systemie Linux możesz użyć funkcji jądra inotify. Można tam znaleźć narzędzia do tworzenia skryptów: inotify-tools .

Przykład użycia z wiki:

#!/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
źródło
1
Większość jednorożców ma podobną funkcję. Niestety każdy z nich ma własny interfejs, a wiele z nich nie ma interfejsu API powłoki.
Gilles „SO- przestań być zły”
4

Istnieje interfejs API o nazwie inotify dla programistów C.

Jest kilka narzędzi, które go używają, np. Incron i inotify-tools .

Mikel
źródło
Ogromne, takie są rzeczy. Na zdrowie Mikel!
Paul D. Waite,
3

Rzeczywiście istnieje: entr (1) uruchomi dowolne polecenia przy zmianie plików, a także zapewnia opcję automatycznego przeładowania w celu zrestartowania serwerów aplikacji.

edycja: kilka przykładów

Odbuduj, jeśli zmienią się pliki źródłowe

$ find *.c | entr make

Uruchom i ponownie załaduj serwer testowy, jeśli pliki się zmienią

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

Udostępnienie agumentu +/path/to/fifopozwala na bardziej skomplikowane skrypty, instruując, entraby zapisać nazwę każdego pliku, który zmienia się w nazwany potok. Poniższe konwertują pliki Markdown w bieżącym katalogu na HTML podczas edycji

$ ls *.md | entr +/tmp/notify &
$ while read F
> do
>   markdown2html $F
> done < /tmp/notify
eradman
źródło
Intrygujące, ale dziwne. Więc ... czyta kilka nazw plików na standardowym wejściu i uruchamia określone polecenie, gdy jedna z nich się zmienia?
tripleee
Wygląda interesująco, dzięki! Czy jest jakiś sposób na entrpodanie nazwy pliku, który również się zmienił?
Tobias Kienzler
Od wersji 2.7 specjalny /_argument (nieco analogiczny do $_ w Perlu) jest zastępowany nazwą pierwszego pliku, który się zmienił
eradman