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
entrlit la liste des fichiers sur stdin et relance la commande à chaque modification détectée.-rredémarre le processus en cours (kill puis relance). Utilisez-spour exécuter la commande via sh -c.- pour des noms contenant des caractères spéciaux, fournissez la liste en NUL (
-0) avecgit ls-files -zoufind -print0. - évitez d’inclure des dossiers volumineux comme
node_modules; filtrez en amont. - combinez avec
bash -lcpour accéder aux alias/env/exports de votre shell lors de l’exécution de la commande.