627 votes

Comment exécuter une commande à chaque fois qu'un fichier est modifié ?

Je veux un moyen simple et rapide d'exécuter une commande à chaque fois qu'un fichier est modifié. Je veux quelque chose de très simple, quelque chose que je laisserai tourner sur un terminal et que je fermerai dès que j'aurai fini de travailler sur ce fichier.

Actuellement, j'utilise ceci :

while read; do ./myfile.py ; done

Et ensuite je dois aller dans ce terminal et appuyer sur Enter chaque fois que j'enregistre ce fichier sur mon éditeur. Ce que je veux, c'est quelque chose comme ça :

while sleep_until_file_has_changed myfile.py ; do ./myfile.py ; done

Ou toute autre solution aussi simple que cela.

BTW : J'utilise Vim, et je sais que je peux ajouter une autocommande pour exécuter quelque chose sur BufWrite, mais ce n'est pas le genre de solution que je veux maintenant.

Mise à jour : Je veux quelque chose de simple, jetable si possible. De plus, je veux quelque chose qui s'exécute dans un terminal car je veux voir la sortie du programme (je veux voir les messages d'erreur).

A propos des réponses : Merci pour toutes vos réponses ! Elles sont toutes très bonnes, et chacune adopte une approche très différente des autres. Comme je ne dois en accepter qu'une seule, j'accepte celle que j'ai effectivement utilisée (elle était simple, rapide et facile à mémoriser), même si je sais qu'elle n'est pas la plus élégante.

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)

5voto

masterxilo Points 438

Vous pouvez essayer réflexe .

Reflex est un petit outil permettant de surveiller un répertoire et de réexécuter une commande lorsque certains fichiers changent. Il est idéal pour exécuter automatiquement des tâches de compilation, d'impression et de test et pour recharger votre application lorsque le code change.

# Rerun make whenever a .c file changes
reflex -r '\.c$' make

0 votes

Pouvez-vous citer / expliquer un peu l'outil ? Lisez rapidement comment recommander un logiciel à titre indicatif.

4voto

Dalroth Points 2468

Un peu plus du côté de la programmation, mais vous voulez quelque chose comme inotify . Il existe des implémentations dans de nombreux langages, tels que jnotify y pyinotify .

Cette bibliothèque vous permet de surveiller des fichiers uniques ou des répertoires entiers, et renvoie des événements lorsqu'une action est découverte. Les informations renvoyées comprennent le nom du fichier, l'action (création, modification, renommage, suppression) et le chemin du fichier, entre autres informations utiles.

4voto

akond Points 246

Pour ceux d'entre vous qui recherchent une solution FreeBSD, voici le portage :

/usr/ports/sysutils/wait_on

3voto

DrBeco Points 1675

Une réponse oneliner que j'utilise pour garder la trace d'un changement de fichier :

$ while true ; do NX=`stat -c %Z file` ; [[ $BF != $NX ]] && date >> ~/tmp/fchg && BF=$NX || sleep 2 ; done

Vous n'avez pas besoin d'initialiser BF si vous savez que la première date est l'heure de départ.

C'est simple et portable. Il existe une autre réponse basée sur la même stratégie utilisant un script ici. Jetez également un coup d'œil.


Utilisation : Je l'utilise pour déboguer et garder un oeil sur ~/.kde/share/config/plasma-desktop-appletsrc qui, pour une raison inconnue, n'arrête pas de perdre mon SwitchTabsOnHover=false

3voto

Fernando Silva Points 31

J'utilise ce script pour le faire. J'utilise inotify en mode surveillance.

#!/bin/bash
MONDIR=$(dirname $1)
ARQ=$(basename $1)

inotifywait -mr -e close_write $MONDIR | while read base event file 
do
  if (echo $file |grep -i "$ARQ") ; then
    $1
  fi
done

Enregistrez ce fichier sous le nom de runatwrite.sh

Usage: runatwrite.sh myfile.sh

il exécutera myfile.sh à chaque écriture.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X