Écriture d'une fonction Zsh qui réexécute automatiquement une commande lors de l'enregistrement du fichier
-
11-12-2019 - |
Question
Je veux écrire une fonction Zsh qui ressemble à :
smartwatch [WATCH_FILE] [COMMAND_TO_RUN] [COMMAND_ARGS]
De telle sorte qu'après WATCH_FILE
est sauvé, que COMMAND_TO_RUN
sera exécuté et smartwatch
attendra que le fichier soit à nouveau enregistré.Cela me serait utile dans ce scénario :
smartwatch server.py python server.py
Ainsi, chaque fois que je modifie le fichier du serveur, le serveur est redémarré.J'ai entendu dire que outils inotify pourrait peut-être aider, alors j'utilise inotifywait
, mais si quelqu'un connaît un meilleur outil, faites-le-moi savoir.Voici ce que j'ai jusqu'à présent :
smartwatch() {
WATCH=$1
CMD=$2
ARGS=$*[3,-1]
$CMD $ARGS &!
PID=$!
inotifywait -qq $WATCH
kill $PID
exec smartwatch $WATCH $CMD $ARGS
}
Cette solution est plutôt lente et peu élégante.Quelqu'un connaît-il un moyen de rendre cela plus efficace ou au moins plus propre ?
La solution
Après quelques manipulations, voici ce que j'ai obtenu :
onsave() {
while true
do
eval "$1 &!"
trap "kill $! &> /dev/null; return;" SIGINT SIGTERM
inotifywait -e modify -qq $2
kill $! &> /dev/null
done
}
Donc tu devrais pouvoir courir onsave "python server.py" server.py