Написание функции Zsh, которая автоматически запускает команду сохранения файла

Я хочу написать функцию Zsh, которая выглядит следующим образом:

smartwatch [WATCH_FILE] [COMMAND_TO_RUN] [COMMAND_ARGS]

Такой, что после WATCH_FILE сохраняется, что COMMAND_TO_RUN будет работать и smartwatch будет ждать, пока файл будет сохранен снова. Это было бы полезно для меня в этом сценарии:

smartwatch server.py python server.py

Поэтому каждый раз, когда я изменяю файл сервера, сервер перезапускается. Я слышал, что inotify-tools могут помочь, поэтому я использую inotifywait, но если кто-то знает лучший инструмент, дайте мне знать. Вот что у меня так далеко:

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

Это решение довольно медленное и не очень элегантное. Кто-нибудь знает способ сделать это более эффективным или хотя бы чище?

1 ответ

Решение

После некоторой тряски вот что я закончил:

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

Таким образом, вы должны быть в состоянии бежать onsave "python server.py" server.py

Другие вопросы по тегам