Domanda

Voglio scrivere una funzione ZSH che sembra:

smartwatch [WATCH_FILE] [COMMAND_TO_RUN] [COMMAND_ARGS]
.

tale che dopo WATCH_FILE viene salvato, che COMMAND_TO_RUN verrà eseguito e smartwatch attenderà che il file venga salvato di nuovo.Questo sarebbe utile per me in questo scenario:

smartwatch server.py python server.py
.

Quindi ogni volta che modifico il file del server, il server viene riavviato.Ho sentito che inotify-tools potrebbe essere in grado di aiutare,Quindi sto usando inotifywait, ma se qualcuno conosce uno strumento migliore, fammi sapere.Ecco cosa ho finora:

smartwatch() {                      
   WATCH=$1                         
   CMD=$2                           
   ARGS=$*[3,-1]                    
   $CMD $ARGS &!                    
   PID=$!                           
   inotifywait -qq $WATCH           
   kill $PID                        
   exec smartwatch $WATCH $CMD $ARGS
}    
.

Questa soluzione è piuttosto lenta e non molto elegante.Qualcuno conosce un modo per rendere questo più efficiente o almeno più pulito?

È stato utile?

Soluzione

Dopo alcuni giocherelloni, ecco cosa ho finito con:

onsave() {
   while true
   do
      eval "$1 &!"
      trap "kill $! &> /dev/null; return;" SIGINT SIGTERM
      inotifywait -e modify -qq $2
      kill $! &> /dev/null
   done
}
.

Quindi dovresti essere in grado di eseguire onsave "python server.py" server.py

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top