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?

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...

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”


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.