Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Linux-скрипт, который отслеживает изменения файлов в папках (как это делает autospec!)

Автор вопроса: Ian VaughanОтветов: 6

Я хочу автоматически запускать сборку при каждом изменении файла.

Я использовал autospec (RSpec) в Ruby, и мне это понравилось.

Как это можно сделать в Баше?

  • см. также stackoverflow.com/q/4060212/119790 Ian Vaughan 10.02.2011
  • см. также stackoverflow.com/q/880263/119790 Ian Vaughan 10.02.2011
  • См. также superuser.com/questions/181517/ Denilson Sá Maia 12.03.2014

bashlinuxbuildautomationrspec

Ответы

Ответ 1 · рейтинг 14 · Dennis Williamson

Взгляните на incron и inotify-tools.

Ответ 2 · рейтинг 6 · zed_0xff

ключевые слова - это команды inotifywait и inotifywatch.

Ответ 3 · рейтинг 5 · Ian Vaughan

Прочитав ответы на другие сообщения, я нашел сообщение (теперь его нет), я создал этот скрипт: -

#!/bin/bash

sha=0
previous_sha=0

update_sha()
{
    sha=`ls -lR . | sha1sum`
}

build () {
    ## Build/make commands here
    echo
    echo "--> Monitor: Monitoring filesystem... (Press enter to force a build/update)"
}

changed () {
    echo "--> Monitor: Files changed, Building..."
    build
    previous_sha=$sha
}

compare () {
    update_sha
    if [[ $sha != $previous_sha ]] ; then changed; fi
}

run () {
    while true; do

        compare

        read -s -t 1 && (
            echo "--> Monitor: Forced Update..."
            build
        )

    done
}

echo "--> Monitor: Init..."
echo "--> Monitor: Monitoring filesystem... (Press enter to force a build/update)"
run

Ответ 4 · рейтинг 5 · VDR

Как насчет этого скрипта? Использует команду 'stat' для получения времени доступа к файлу и запускает команду всякий раз, когда происходит изменение времени доступа (каждый раз при доступе к файлу).

#!/bin/bash
while true
do
   ATIME=`stat -c %Z /path/to/the/file.txt`
   if [[ "$ATIME" != "$LTIME" ]]
   then
       echo "RUN COMMNAD"
       LTIME=$ATIME
   fi
   sleep 5
done

Ответ 5 · рейтинг 3 · Mike S

См. этот пример как улучшение ответа Яна Вогана:

#!/usr/bin/env bash
# script:  watch
# author:  Mike Smullin <[email protected]>
# license: GPLv3
# description:
#   watches the given path for changes
#   and executes a given command when changes occur
# usage:
#   watch <path> <cmd...>
#

path=$1
shift
cmd=$*
sha=0
update_sha() {
  sha=`ls -lR --time-style=full-iso $path | sha1sum`
}
update_sha
previous_sha=$sha
build() {
  echo -en " building...\n\n"
  $cmd
  echo -en "\n--> resumed watching."
}
compare() {
  update_sha
  if [[ $sha != $previous_sha ]] ; then
    echo -n "change detected,"
    build
    previous_sha=$sha
  else
    echo -n .
  fi
}
trap build SIGINT
trap exit SIGQUIT

echo -e  "--> Press Ctrl+C to force build, Ctrl+\\ to exit."
echo -en "--> watching \"$path\"."
while true; do
  compare
  sleep 1
done

Ответ 6 · рейтинг 2 · kenorb

Если у вас установлен entr, то в оболочке вы можете использовать следующий синтаксис:

while true; do find src/ | entr -d make build; done

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы