diff --git a/eye.sh b/eye.sh index 784abbd..f34fd33 100755 --- a/eye.sh +++ b/eye.sh @@ -7,12 +7,10 @@ BINARY_PATH="./main" # Путь до бинарного файла BUILD_CMD="go build -o $BINARY_PATH main.go" # Команда для сборки ################################################################################### -# Нужное для работы скрипта (не менять) -stty -echoctl # Отключает вывод управляющих символов (включая ^C). -declare -A LAST_MODS # Ассоциативный массив для хранения времени последней модификации -declare -A LAST_COUNTS # Ассоциативный массив для хранения количества файлов -CLEANUP_DONE=0 # Была ли уже вызвана cleanup -PID="" # Для хранения PID запущенного процесса +# Массивы для хранения информации о директориях +declare -A LAST_MODS +declare -A LAST_COUNTS +CLEANUP_DONE=0 # # Для вывода в синем цвете @@ -23,73 +21,76 @@ blue() { # Функция для очистки при завершении работы скрипта cleanup() { [ $CLEANUP_DONE -eq 1 ] && exit 0 - CLEANUP_DONE=1 blue "EYE | cleanup..." - kill_previous + kill_previous $1 rm -f $BINARY_PATH blue "EYE | see you later!" + CLEANUP_DONE=1 exit 0 } -# Ловушка для сигналов завершения -trap cleanup SIGINT SIGTERM SIGHUP SIGQUIT EXIT -# # Функция для убийства процесса kill_previous() { - if [ -n "$PID" ] && kill -0 $PID 2>/dev/null; then # 2>/dev/null глушит ненужные сообщения в stderr - kill $PID - blue "EYE | process killed (PID: $PID)" + local pid=$1 + if [ -n "$pid" ] && kill -0 $pid 2>/dev/null; then + kill $pid + blue "EYE | process killed (PID: $pid)" fi } -# # Функция для проверки изменений check_changes() { local changed=0 - + for dir in "${WATCH_DIRS[@]}"; do - # Получаем текущее время модификации и количество файлов local current_mod=$(find "$dir" -type f -exec stat -c %Y {} \; | sort -nr | head -1) local current_count=$(find "$dir" -type f 2>/dev/null | wc -l) - - # Проверяем изменения + if { [ -n "$current_mod" ] && [ "$current_mod" -gt "${LAST_MODS[$dir]}" ]; } || [ "$current_count" -ne "${LAST_COUNTS[$dir]}" ]; then changed=1 LAST_MODS["$dir"]=$current_mod LAST_COUNTS["$dir"]=$current_count - [ -n "$PID" ] && blue "EYE | changes detected in \033[35m$dir\033[0m" + [ -n "$1" ] && blue "EYE | changes detected in \033[94m$dir\033[0m" fi done - + return $changed } + +# Основная функция +main() { + local pid="" + + # Ловушка для сигналов завершения + trap 'cleanup $pid' SIGINT SIGTERM SIGHUP SIGQUIT EXIT + + # Инициализация массивов + for dir in "${WATCH_DIRS[@]}"; do + LAST_MODS["$dir"]=0 + LAST_COUNTS["$dir"]=$(find "$dir" -type f 2>/dev/null | wc -l) + blue "EYE | started watching the directory \033[94m$dir\033[0m" + done + + # Основной цикл работы скрипта + while true; do + check_changes $pid + if [ $? -eq 1 ]; then + blue "EYE | rebuilding..." + eval $BUILD_CMD 2>/dev/null + if [ $? -eq 0 ]; then + blue "EYE | build successful. restarting..." + kill_previous $pid + $BINARY_PATH & + pid=$! + blue "EYE | started new process (PID: $pid)" + else + blue "EYE | build failed" + fi + fi + + sleep $DURATION + done +} # -# Инициализация массивов -for dir in "${WATCH_DIRS[@]}"; do # @ - обозначает "все элементы массива" - LAST_MODS["$dir"]=0 - LAST_COUNTS["$dir"]=$(find "$dir" -type f 2>/dev/null | wc -l) - blue "EYE | started watching the directory \033[35m$dir\033[0m" -done -# - -# Основной цикл работы скрипта -while true; do - check_changes - if [ $? -eq 1 ]; then - blue "EYE | rebuilding..." - $BUILD_CMD 2>/dev/null # Сборка - if [ $? -eq 0 ]; then # $? - код возврата - blue "EYE | build successful. restarting..." - kill_previous # Убивает предыдущий процесс - $BINARY_PATH & # & — Запускает процесс в фоновом режиме, чтобы eye не зависал - PID=$! # $! - спец. переменная в bash, содержащая pid последнего запущенного фонового процесса - blue "EYE | started new process (PID: $PID)" - else - blue "EYE | build failed" - fi - fi - - sleep $DURATION -done -# \ No newline at end of file +main \ No newline at end of file