Наблюдать за изменениями в файлах и перезапускать тесты

Есть исходные файлы проекта. Хочу, что бы при их изменении в процессе разработки автоматически запускались тесты.

Для этого написал такой скрипт:

#!/bin/bash

WATCH_DIR=.

while read -r file date events; do

  if [[ "$file" =~ .*php$ ]]; then
    printf '\033[33m%*s\033[0m\n' $(tput cols) ' ' | tr ' ' '-'
    echo -e "\033[32m$date\033[0m"
    echo "$events" "$file"
    composer test
  fi

done < <(inotifywait -mqr --timefmt '%T' --format '%w%f %T %e' -e modify -e create -e delete -e move --exclude '\/(vendor|storage|cache)\/|.*\.sw[px]|.*~$' "$WATCH_DIR")

Тесты занимают какое-то время. Если в это время файлы снова изменились, тест доходит до конца и запускается повторно. Меня это не устраивает. Я хочу, чтобы при изменении текущее тестирование завершалось, и запускалось заново.

Как это сделать?


Ответы (1 шт):

Автор решения: Total Pusher

Все решилось довольно просто.

В начале цикла прибиваем прошлую команду kill $TEST_ID. В конце цикла - назначаем новый ID:

composer test &
TEST_ID=$!

Все вместе получилось так:

#!/bin/bash

WATCH_DIR=.
TEST_ID=

while read -r file date events; do

  if [[ "$file" =~ .*php$ ]]; then
    kill $TEST_ID
    printf '\033[33m%*s\033[0m\n' $(tput cols) ' ' | tr ' ' '-'
    echo -e "\033[32m$date\033[0m"
    echo "$events" "$file"
    composer test &
    TEST_ID=$!

    echo $TEST_ID
  fi

done < <(inotifywait -mqr --timefmt '%T' --format '%w%f %T %e' -e modify -e create -e delete -e move --exclude '\/(vendor|storage|cache)\/|.*\.sw[px]|.*~$' "$WATCH_DIR")
→ Ссылка