скрипт linux, который контролирует изменения файлов в папках (например, autospec!)

17

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

Я использовал autospec (RSpec) в Ruby и любил это.

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

    
задан Ian Vaughan 04.06.2010 в 11:08
источник
  • см. также stackoverflow.com/q/4060212/119790 –  Ian Vaughan 10.02.2011 в 18:30
  • см. также stackoverflow.com/q/880263/119790 –  Ian Vaughan 10.02.2011 в 18:31
  • См. также superuser.com/questions/181517/... –  Denilson Sá Maia 12.03.2014 в 00:49

6 ответов

5

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

#!/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
    
ответ дан Ian Vaughan 10.02.2011 в 17:54
  • это самое страшное решение. он будет разыгрывать все файлы из каталога каждую секунду, что является огромным успехом. пожалуйста, посмотрите на решение dennis williamson !!! –  kritzikratzi 23.05.2012 в 10:04
  • Пожалуйста, удалите ваши нисходящие голоса из моих ответов, они являются действительными ответами и работают, просто потому, что они неприемлемы для вашего использования, они были хороши для моих и, возможно, для других людей. Таким образом, downvoting означает, что другие не будут пробовать этот ответ. Downvotes - это действительно только для вещей, которые не работают вообще или находятся вне темы и т. Д. Кроме того, пожалуйста, отредактируйте свои комментарии, удалив слово horrible, его личный вариант, вы можете сказать, что он не попал в производительность, но оставьте его при этом. Приветствия. –  Ian Vaughan 03.05.2013 в 11:45
  • Поскольку что-то работает, это не значит, что это хорошая идея. На мой взгляд, ваш ответ одинаково тривиальный и проблематичный. Я не вижу причин, чтобы удалить мой downvote. –  kritzikratzi 04.05.2013 в 16:29
  • Хорошо, ваш вызов, независимо от того, что вы выберете, но могу ли я указать stackoverflow.com/privileges/vote-down «Используйте ваши downvotes всякий раз, когда вы сталкиваетесь с грубым, неряшливым, не затраченным на усилия сообщением или ответом, который ясно и, возможно, опасно некорректно ». Я бы сказал, что его не неряшливые и не затраченные усилия, и это, безусловно, не опасно неверно. Если вы все еще считаете иначе, чем это хорошо, спасибо. –  Ian Vaughan 08.05.2013 в 13:55
  • я фактически дважды проверил голосовые директивы до публикации моего последнего комментария. –  kritzikratzi 08.05.2013 в 18:15
Показать остальные комментарии
14

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

ответ дан Dennis Williamson 04.06.2010 в 15:23
  • В частности, см. github.com/tartley/rerun2, который использует инструменты inotify и позволяет легко запускать пользовательскую команду, как объясняется в игнорированном ответе Джонатана Хартли на суперпользователя –  nealmcb 23.11.2015 в 17:17
5

ключевые слова: inotifywait & amp; Команды inotifywatch

    
ответ дан zed_0xff 04.06.2010 в 11:10
5

Как насчет этого скрипта? Использует команду «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
    
ответ дан VDR 20.08.2013 в 19:01
  • Спасибо, один пункт tho, который контролирует только один файл ATIME. –  Ian Vaughan 20.08.2013 в 22:28
  • Ну, мы можем использовать команду stat для доступа / мониторинга времени доступа DIR: stat -c% Z / var / tmp запускает скрипты всякий раз, когда есть какое-либо добавление или удаление в DIR –  VDR 21.08.2013 в 16:28
  • Мне очень нравится простота этого решения. –  Richard 12.05.2017 в 02:36
2

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

while true; do find src/ | entr -d make build; done
    
ответ дан kenorb 06.07.2016 в 19:54
2

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

#!/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=
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
    
ответ дан Mike Smullin 01.09.2013 в 01:19