Kann ein Bash-Skript an eine Datei angehängt werden?


32

Ich möchte, dass ein Skript in den Ruhezustand versetzt wird, es sei denn, eine bestimmte Datei wird geändert / gelöscht (oder eine Datei, die in einem bestimmten Verzeichnis erstellt wurde, oder ...). Kann dies auf elegante Weise erreicht werden? Die einfachste Sache, die mir in den Sinn kommt, ist eine Schleife, die einige Zeit ruht, bevor sie den Status erneut überprüft. Vielleicht gibt es aber auch eine elegantere Möglichkeit.

Antworten:


34

Unter Linux können Sie die Kernel- inotifyFunktion verwenden. Dort finden Sie Tools für die Skripterstellung: inotify-tools .

Beispielgebrauch aus 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
Die meisten Unices haben eine ähnliche Funktion. Leider hat jedes eine eigene Schnittstelle und viele haben keine Shell-API.
Gilles 'SO - hör auf böse zu sein'


3

In der Tat gibt es: entr (1) führt beliebige Befehle aus, wenn sich Dateien ändern, und bietet auch eine Option zum automatischen Neuladen zum Neustarten von Anwendungsservern.

edit: einige beispiele

Neu erstellen, wenn sich die Quelldateien ändern

$ find *.c | entr make

Starten Sie den Testserver und laden Sie ihn automatisch neu, wenn sich die Dateien ändern

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

Wenn Sie das Agument bereitstellen, +/path/to/fifokönnen Sie komplexere Skripte erstellen, indem Sie entrden Namen jeder Datei schreiben, die sich in eine Named Pipe ändert. Im Folgenden werden Markdown-Dateien im aktuellen Verzeichnis beim Bearbeiten in HTML konvertiert

$ ls *.md | entr +/tmp/notify &
$ while read F
> do
>   markdown2html $F
> done < /tmp/notify

Faszinierend, aber seltsam. Also ... liest es eine Reihe von Dateinamen in der Standardeingabe und führt den angegebenen Befehl aus, wenn sich einer von ihnen ändert?
Tripleee

Sieht interessant aus, danke! Gibt es eine Möglichkeit, entrden Namen der Datei, die sich ebenfalls geändert hat, weiterzugeben?
Tobias Kienzler

Ab Version 2.7 wird das Sonderargument /_(etwas analog zu $_ in Perl) durch den Namen der ersten Datei ersetzt, die sich geändert hat
eradman
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.