J'ai écrit un programme Python pour faire exactement cela, appelé rerun
.
MISE À JOUR : Cette réponse est un script Python qui sonde les changements, ce qui est utile dans certaines circonstances. Pour un script Bash sous Linux uniquement qui utilise inotify, voir mon autre réponse, recherchez 'rerun2' sur cette page.
Installer pour Python2 ou Python3 avec :
pip install --user rerun
et l'utilisation est très simple :
rerun "COMMAND"
La commande est attendue comme un seul argument, et non comme une séquence d'arguments séparés par des espaces. Par conséquent, il faut la citer comme indiqué, ce qui réduit le nombre de caractères d'échappement supplémentaires que vous auriez dû ajouter. Tapez simplement la commande comme vous l'auriez fait sur la ligne de commande, mais entre guillemets.
Par défaut, il surveille tous les fichiers dans ou sous le répertoire actuel, en ignorant des choses comme les répertoires de contrôle de source connus, .git, .svn, etc.
Les drapeaux optionnels incluent '-i NAME' qui ignore les changements dans les fichiers ou répertoires nommés. Cette option peut être donnée plusieurs fois.
Puisque c'est un script Python, il doit exécuter la commande en tant que sous-processus, et nous utilisons une nouvelle instance du script actuel de l'utilisateur pour interpréter 'COMMAND' et décider quel processus exécuter réellement. Cependant, si votre commande contient des alias script et autres définis dans .bashrc, ils ne seront pas chargés par le sous-shell. Pour résoudre ce problème, vous pouvez donner à rerun l'option '-I', pour utiliser des sous-shells interactifs (alias 'login'). Ceci est plus lent et plus sujet aux erreurs que le démarrage d'un script normal, parce qu'il doit sourcer votre .bashrc.
Je l'utilise avec Python 3, mais la dernière fois que j'ai vérifié, rerun fonctionnait toujours avec Python 2.
L'arme à double tranchant est qu'il utilise le sondage au lieu de l'inotify. Le bon côté des choses, c'est qu'elle fonctionne sur tous les systèmes d'exploitation. De plus, elle est meilleure que d'autres solutions présentées ici en ce sens qu'elle n'exécute la commande donnée qu'une seule fois pour un ensemble de modifications du système de fichiers, et non pas une fois par fichier modifié, tout en exécutant la commande une seconde fois si un fichier change à nouveau pendant l'exécution de la commande.
L'inconvénient, c'est que l'interrogation signifie qu'il y a une latence de 0,0 à 1,0 seconde, et bien sûr, c'est lent pour surveiller des répertoires extrêmement grands. Cela dit, je n'ai jamais rencontré de projet suffisamment grand pour que cela soit perceptible, tant que vous utilisez '-i' pour ignorer les éléments importants comme votre virtualenv et vos node_modules.
Hmmm. rerun
m'a été indispensable pendant des années - je l'utilise essentiellement huit heures par jour pour exécuter des tests, reconstruire des fichiers de points au fur et à mesure que je les modifie, etc. Mais maintenant que j'en suis à taper ce texte 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 qui fonctionne avec des alias sans aucun bidouillage supplémentaire.)
0 votes
Possibilité de duplication de site croisé de : stackoverflow.com/questions/2972765/ ( bien qu'ici c'est le sujet =) )
0 votes
J'ai déjà référencé un duplicate cross site et il a été refusé :S ;)
4 votes
La solution de Jonathan Hartley s'appuie sur d'autres solutions proposées ici et corrige les gros problèmes des réponses les plus votées : absence de certaines modifications et inefficacité. Veuillez changer la réponse acceptée par la sienne, qui est également maintenue sur github à l'adresse suivante github.com/tartley/rerun2 (ou à une autre solution sans ces défauts)
0 votes
watch -g
se termine lorsque la sortie de la commande change, par exemple :while :; do watch -gn .1 stat -c %Z file.tex && pdflatex -interaction batchmode file.tex && pkill -HUP mupdf; done
. Où:
évalue àtrue
y-n .1
exécute la commande (stat
) toutes les 0,1 seconde.stat -c %Z
donne l'heure du dernier accès au fichier. L'inconvénient est que cela ne peut être arrêté qu'avec^Z
,kill %1
1 votes
@Zaz Au lieu de
while :; do …; done
j'utilise habituellementwhile sleep 1; do …; done
. De cette façon, je peux facilement^C
pendant lesleep
appel. De plus, il évite d'accaparer le CPU en limitant la boucle à une fréquence maximale de 1 Hz (réglable en modifiant la valeur de l'attributsleep
paramètres).