Shell 编写一个Zsh函数,在保存文件时自动重新运行命令

Shell 编写一个Zsh函数,在保存文件时自动重新运行命令,shell,zsh,inotify,inotify-tools,Shell,Zsh,Inotify,Inotify Tools,我想写一个Zsh函数,它看起来像: smartwatch [WATCH_FILE] [COMMAND_TO_RUN] [COMMAND_ARGS] 这样,在保存WATCH_文件后,将运行命令_TO_RUN,并且智能手表将等待再次保存文件。在这种情况下,这对我很有帮助: smartwatch server.py python server.py 因此,每次我修改服务器文件时,服务器都会重新启动。我听说这可能会有所帮助,所以我正在使用inotifywait,但如果有人知道更好的工具,请告诉我。以

我想写一个Zsh函数,它看起来像:

smartwatch [WATCH_FILE] [COMMAND_TO_RUN] [COMMAND_ARGS]
这样,在保存
WATCH_文件
后,将运行
命令_TO_RUN
,并且
智能手表
将等待再次保存文件。在这种情况下,这对我很有帮助:

smartwatch server.py python server.py
因此,每次我修改服务器文件时,服务器都会重新启动。我听说这可能会有所帮助,所以我正在使用inotifywait,但如果有人知道更好的工具,请告诉我。以下是我目前掌握的情况:

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

这个解决方案相当缓慢,也不是很优雅。有谁知道一种更有效或至少更干净的方法吗?

经过一番努力,我最终得出了以下结论:

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

因此,您应该能够在save“python server.py”server.py上运行

inotifywait将在任何事件发生时完成。您可能希望指定“-e modify-e move_self-e delete_self”以防止在任何进程读取该文件时重新启动守护进程。