Tun Sie etwas, wenn eine Datei geändert wird

10

Wenn ich ein LaTeX-Dokument schreibe, drücke ich in meinem Editor F6, um häufig zu kompilieren. Oder wenn ich SASS verwende, tippe ich oft make, um meine .scssin umzuwandeln .css.

Jetzt möchte ich die Maschine makejedes Mal die Drecksarbeit machen und laufen lassen oder etwas anderes, wenn sich eine bestimmte Datei ändert.

Bisher habe ich ein Terminalfenster offen gehalten und den Pfeil nach oben gedrückt und bin zurückgekehrt. Oder ich habe verwendet watch make, aber das scheint eine seltsame Lösung zu sein.

Gibt es unter Linux eine gute Möglichkeit, etwas zu tun, wenn sich eine bestimmte Datei ändert?

Martin Ueding
quelle

Antworten:

4

Sie suchen inotifywait, Teil von Inotify-Tools . Es gibt einige Beispiele für die Verwendung auf der Projektwebsite, aber ein einfacher Ansatz ist:

while true; do inotifywait code.cpp -e modify; make; done

der Schlüsselteil davon ist,

inotifywait code.cpp -e modify

Dieser Befehl wartet, bis er code.cppgeändert wurde, und beendet ihn dann. Setzen Sie die Endlosschleife ein und führen Sie makesie an, damit sie nach jeder Änderung ständig neu erstellt wird.

Neben dem Warten auf Änderungen können Sie auch auf das Erstellen, Löschen, Zugreifen, Öffnen, Schließen und mehr warten. Ich empfehle dringend, in den Projektbeispielen und in der Manpage inotifywait nach weiteren Ideen zu suchen, wie es verwendet werden kann.

lostriebo
quelle
Genau das suche ich!
Martin Ueding
1

Schauen Sie sich incron an , ein Cron-ähnliches Paket, das auf Dateisystemereignisse anstelle von Zeitereignissen reagiert. Das Paket besteht aus einem Daemon ( incrond) und einem Tabellenmanipulator ( incrontab), analog zu dem bekannten crond/ crontabPaar Cron.

Mit incron können Sie problemlos die Ausführung veranlassen, makewenn bestimmte Dateien und / oder Verzeichnisse geändert werden.

Steven Montag
quelle
Das scheint einerseits ein wenig übertrieben zu sein, andererseits ist es genau das richtige Werkzeug. Ich muss es überprüfen, vielleicht kann ich es für jede Programmiersitzung aktivieren und deaktivieren.
Martin Ueding
0

Anstatt watch makewie wäre es watch ls? Dann genau dann, makewenn sich der Zeitstempel ändert.

Scott C Wilson
quelle
Nun, machen Sie bereits Überprüfungen der Zeitstempel, so dass es ziemlich sinnlos ist, die Zeit zu überprüfen und dann die Zeit erneut überprüfen zu lassen.
Martin Ueding
Richtig, aber das Laufen von make ist teurer als das Laufen von ls.
Scott C Wilson
1
Und wenn mein Makefile nur zwei Zeilen für diese Single enthält .tex? Denken Sie, dass es sich lohnt, einen lsParser zu schreiben ?
Martin Ueding