Ik heb hiervoor een Python-programma geschreven, genaamd rerun
.
UPDATE: Dit antwoord is een Python-script dat polls voor wijzigingen uitvoert, wat in sommige omstandigheden nuttig is. Voor een Linux-only Bash script dat gebruik maakt van inotify, zie mijn andere antwoord, zoek op deze pagina naar ‘rerun2’.
Installeren voor Python2 of Python3 met:
pip install --user rerun
en het gebruik is zeer eenvoudig:
rerun "COMMAND"
Het commando wordt verwacht als een enkel argument, niet als een opeenvolging van ruimte-afhankelijke args. Citeer het daarom zoals afgebeeld, wat het aantal extra ontsnappingen die je zou moeten toevoegen, vermindert. Typ het commando zoals je het zou hebben getypt op de commandoregel, maar omringd door aanhalingstekens.
Standaard kijkt het naar alle bestanden in of onder de huidige directory, waarbij zaken als bekende broncontrole dirs, .git, .svn, etc. worden overgeslagen.
Optionele vlaggen bevatten ‘-i NAME’ die veranderingen in benoemde bestanden of directories negeert. Dit kan meerdere malen gegeven worden.
Aangezien het een Python-script is, moet het de opdracht als een sub-proces uitvoeren, en we gebruiken een nieuwe instantie van de huidige shell van de gebruiker om ‘COMMAND’ te interpreteren en te beslissen welk proces daadwerkelijk uitgevoerd moet worden. Als uw commando echter shell-aliassen en dergelijke bevat die zijn gedefinieerd in .bashrc, zullen deze niet worden geladen door de subshell. Om dit op te lossen kunt u een ‘-I’ vlag geven, om interactieve (aka ‘login’) subshells te gebruiken. Dit is langzamer en meer foutgevoelig dan het starten van een gewone shell, omdat het je .bashrc moet bronnen.
Ik gebruik het met Python 3, maar de laatste keer dat ik controleerde werkte rerun nog steeds met Python 2.
Dubbelzijdig zwaard is dat het gebruik maakt van polling in plaats van inotify. Aan de andere kant betekent dit dat het op elk OS werkt. Plus, het is beter dan sommige andere oplossingen die hier worden getoond in termen van het slechts één keer uitvoeren van het gegeven commando voor een aantal wijzigingen in het bestandssysteem, niet één keer per gewijzigd bestand, terwijl het tegelijkertijd het commando een tweede keer uitvoert als er tijdens het uitvoeren van het commando weer bestanden veranderen.
Aan de andere kant betekent polling dat er een 0.0 tot 1.0 seconden vertraging is, en natuurlijk is het langzaam om extreem grote mappen te monitoren. Dat gezegd hebbende, ik ben nog nooit een project tegengekomen dat zo groot is dat dit zelfs maar merkbaar is zolang je ‘-i’ gebruikt om grote dingen zoals je virtualenv en node_modules te negeren.
Hmmm. rerun
is voor mij al jaren onmisbaar - ik gebruik het in principe acht uur per dag voor het uitvoeren van tests, het herbouwen van punt-bestanden terwijl ik ze bewerk, etc. Maar nu ik dit hier kom typen, is het duidelijk dat ik moet overschakelen naar een oplossing die gebruik maakt van inotify (ik gebruik niet langer Windows of OSX.) en is geschreven in Bash (dus het werkt met aliassen zonder extra gepruts).