J'ai écrit un programme Python pour faire exactement cela, appelé rerun
.
UPDATE : Cette réponse est un script Python qui interroge les changements, ce qui est utile dans certaines circonstances. Pour un script Bash sous Linux uniquement qui utilise inotify, voir mon autre réponse, cherchez sur cette page “rerun2”.
Installez Python2 ou Python3 avec :
pip install --user rerun
et l'utilisation est très simple :
rerun "COMMAND"
La commande est attendue comme un seul arg, pas une séquence d'args séparés par des espaces. Citez-la donc comme indiqué, ce qui réduit le nombre d'échappements supplémentaires que vous devriez ajouter. Il suffit de taper la commande comme vous l'auriez fait en ligne de commande, mais entre guillemets.
Par défaut, il surveille tous les fichiers dans ou sous le répertoire courant, en sautant des choses comme les répertoires de contrôle de source connus, .git, .svn, etc.
Les options comprennent “-i NAME” qui ignore les modifications apportées aux fichiers ou répertoires nommés. Il peut être donné plusieurs fois.
Comme il s'agit d'un script Python, il doit exécuter la commande comme un sous-processus, et nous utilisons une nouvelle instance du shell actuel de l'utilisateur pour interpréter “COMMAND” et décider du processus à exécuter. Cependant, si votre commande contient des alias de shell et autres qui sont définis dans .bashrc, ceux-ci ne seront pas chargés par le sous-système. Pour remédier à ce problème, vous pouvez donner un drapeau “-I” à la relance, pour utiliser des sous-coques interactifs (alias “login”). C'est plus lent et plus sujet aux erreurs que de lancer un shell normal, car il doit fournir le source de votre .bashrc.
Je l'utilise avec Python 3, mais la dernière fois que j'ai vérifié, la rediffusion fonctionnait toujours avec Python 2.
L'épée à double tranchant est qu'elle utilise le polling au lieu de l'inotify. D'un autre côté, cela signifie qu'il fonctionne sur tous les OS. De plus, il est meilleur que certaines autres solutions présentées ici, car il n'exécute la commande qu'une seule fois pour un ensemble de modifications du système de fichiers, et non pas une fois par fichier modifié, alors qu'en même temps, il exécute la commande une seconde fois si un fichier change à nouveau pendant l'exécution de la commande.
D'un autre côté, l'interrogation signifie qu'il y a une latence de 0,0 à 1,0 seconde, et bien sûr, il est lent à surveiller des répertoires extrêmement importants. Cela dit, je n'ai jamais rencontré de projet suffisamment important pour que cela se remarque, tant que vous utilisez “-i” pour ignorer les gros problèmes comme vos modules virtualenv et node_.
Hmmm. rerun
m'est indispensable depuis des années - je l'utilise en gros huit heures par jour pour effectuer des tests, reconstruire des fichiers .dot au fur et à mesure que je les modifie, etc. Mais maintenant que j'en arrive à taper ça ici, il est clair que je dois passer à une solution qui utilise inotify (je n'utilise plus Windows ou OSX.) et qui est écrite en Bash (donc ça fonctionne avec des alias sans aucun bidouillage supplémentaire.)