Ich habe ein Python-Programm geschrieben, um genau dies zu tun, es heißt rerun
.
UPDATE: Diese Antwort ist ein Python-Skript, das nach Änderungen fragt, was unter bestimmten Umständen nützlich ist. Für ein reines Linux-Bash-Skript, das inotify verwendet, siehe meine andere Antwort, suchen Sie auf dieser Seite nach ‘rerun2’.
Installieren für Python2 oder Python3 mit:
pip install --user rerun
und die Benutzung ist sehr einfach:
rerun "COMMAND"
Der Befehl wird als ein einzelnes arg erwartet, nicht als eine Folge von durch Leerzeichen getrennten Args. Daher zitieren Sie ihn wie gezeigt, was jedes zusätzliche Escaping, das Sie hinzufügen müssten, reduziert. Geben Sie den Befehl einfach so ein, wie Sie ihn in der Kommandozeile eingegeben hätten, aber umgeben von Anführungszeichen.
Standardmäßig überwacht es alle Dateien im oder unter dem aktuellen Verzeichnis und überspringt dabei Dinge wie bekannte Quellcode-Kontrollverzeichnisse, .git, .svn usw.
Optionale Flags enthalten ‘-i NAME’, das Änderungen an benannten Dateien oder Verzeichnissen ignoriert. Dies kann mehrfach angegeben werden.
Da es sich um ein Python-Skript handelt, muss der Befehl als Unterprozess ausgeführt werden, und wir verwenden eine neue Instanz der aktuellen Shell des Benutzers, um ‘COMMAND’ zu interpretieren und zu entscheiden, welcher Prozess tatsächlich ausgeführt werden soll. Wenn Ihr Befehl jedoch Shell-Aliase und ähnliches enthält, die in .bashrc definiert sind, werden diese von der Sub-Shell nicht geladen. Um dies zu beheben, können Sie rerun ein ‘-I’-Flag geben, um interaktive (alias ‘login’) Subshells zu benutzen. Dies ist langsamer und fehleranfälliger als das Starten einer regulären Shell, da sie Ihre .bashrc ausgeben muss.
Ich benutze es mit Python 3, aber das letzte Mal, als ich geprüft habe, dass die Wiederholung immer noch mit Python 2 funktioniert.
Double-edged sword ist, dass es Polling statt inotify verwendet. Auf der anderen Seite bedeutet das, dass es auf jedem Betriebssystem funktioniert. Außerdem ist es besser als einige andere hier gezeigte Lösungen, da es den gegebenen Befehl nur einmal für eine Reihe von Dateisystemänderungen ausführt, nicht einmal pro geänderter Datei, während es gleichzeitig den Befehl ein zweites Mal ausführt, wenn sich irgendwelche Dateien erneut ändern, während der Befehl ausgeführt wird.
Auf der Kehrseite bedeutet Polling, daß es eine Latenzzeit von 0,0 bis 1,0 Sekunden hat, und natürlich ist es langsam, um extrem große Verzeichnisse zu überwachen. Abgesehen davon ist mir noch nie ein Projekt begegnet, das groß genug ist, dass dies überhaupt auffällt, solange man ‘-i’ benutzt, um große Dinge wie die Virtualität und die node_module zu ignorieren.
Hmmm. rerun
ist für mich seit Jahren unverzichtbar - ich benutze es im Grunde täglich acht Stunden für die Durchführung von Tests, den Neuaufbau von Punktdateien, während ich sie bearbeite, usw. Aber jetzt, wo ich das hier tippe, ist es klar, dass ich zu einer Lösung wechseln muss, die inotify verwendet (ich benutze nicht mehr Windows oder OSX.) und in Bash geschrieben ist (so dass es mit Aliasen ohne zusätzliche Fummelei funktioniert).