← retour aux snippets

entr: relancer une commande sur changements

Exécuter automatiquement une commande dès qu'un fichier change (build, tests, reload) sans boucle bricolée.

bash utils #entr#watch#dev#cli

objectif

Relancer une commande à chaque modification de fichier (tests, build, linter, reload local) de manière simple et fiable, sans scripts de surveillance complexes.

code minimal

# relancer pytest quand un fichier .py change
ls **/*.py | entr -r pytest -q

utilisation

# rebuild du site statique de data.pm à chaque changement dans ./src
find ./src -type f -name "*.md" -o -name "*.css" -o -name "*.js" \
  | entr -r bash -lc 'npm run build && echo "build ok $(date -u +%H:%M:%S)"'

# tests Go: relancer go test sur le module courant
ls **/*.go | entr -r go test ./...

# recharger un serveur local après build (en parallèle simple)
ls **/*.{ts,tsx,css,md} | entr -r bash -lc 'npm run build && pkill -HUP -f "serve-data-pm" || true'

# linter auto sur changements (sortie courte)
git ls-files '*.sh' | entr -r bash -lc 'shellcheck -x $(git ls-files "*.sh") || true'

# commande longue: afficher le fichier modifié
git ls-files | entr -r bash -lc 'echo "changed: $0"; make -s build'

variante(s) utile(s)

# mode robuste avec NUL terminator (noms avec espaces/newlines)
git ls-files -z | entr -0 -r bash -lc 'pytest -q'

# filtrer avec fd (plus rapide que find; si installé)
fd -t f '(js|ts|css|md)$' src | entr -r npm run build

# ignorer node_modules et fichiers générés
find . -type f -not -path './node_modules/*' -not -path './dist/*' -name '*.ts' \
  | entr -r bash -lc 'npm test --silent'

# multiple commandes séquencées (fail-fast)
ls **/*.py | entr -r bash -lc 'ruff check . && pytest -q'

# watcher d'un service api.data.pm local: rebuild + restart
ls **/*.{go,tmpl} | entr -r bash -lc 'go build -o bin/api && systemctl --user restart data-pm-api.service'

# écrire un log à chaque run (timestamp)
git ls-files | entr -r bash -lc 'date -u +%Y-%m-%dT%H:%M:%SZ >> .entr.log; make -s build'

notes

  • entr lit la liste des fichiers sur stdin et relance la commande à chaque modification détectée.
  • -r redémarre le processus en cours (kill puis relance). Utilisez -s pour exécuter la commande via sh -c.
  • pour des noms contenant des caractères spéciaux, fournissez la liste en NUL (-0) avec git ls-files -z ou find -print0.
  • évitez d’inclure des dossiers volumineux comme node_modules; filtrez en amont.
  • combinez avec bash -lc pour accéder aux alias/env/exports de votre shell lors de l’exécution de la commande.