Um script bash pode ser ligado a um arquivo?

32

Eu quero que um script seja suspenso a menos que um determinado arquivo seja modificado / excluído (ou um arquivo criado em um determinado diretório ou ...). Isso pode ser conseguido de alguma forma elegante? A coisa mais simples que vem à minha mente é um loop que dorme por algum tempo antes de verificar o status novamente, mas talvez haja uma maneira mais elegante?

    
por Tobias Kienzler 07.01.2011 / 14:04

3 respostas

33

No linux, você pode usar o recurso inotify do kernel. Ferramentas para scripts podem ser encontradas lá: inotify-tools .

Exemplo de uso do wiki:

#!/bin/sh

EVENT=$(inotifywait --format '%e' ~/file1) # blocking without looping
[ $? != 0 ] && exit
[ "$EVENT" = "MODIFY" ] && echo 'file modified!'
[ "$EVENT" = "DELETE_SELF" ] && echo 'file deleted!'
# etc...
    
por 07.01.2011 / 14:20
4

Existe uma API chamada inotify para programadores C.

Existem algumas ferramentas que o utilizam, por ex. incron e inotify-tools .

    
por 06.04.2011 / 10:43
3

Realmente existe: entr (1) executará comandos arbitrários quando os arquivos forem alterados, e também fornecerá uma opção de recarregamento automático para reiniciar servidores de aplicativos.

edit: alguns exemplos

Reconstrua se os arquivos de fontes mudarem

$ find *.c | entr make

Inicie e teste automaticamente o servidor de teste se os arquivos forem alterados

$ ls *.py | entr -r python main.py

Fornecer o argumento +/path/to/fifo permite um script mais complexo instruindo entr a gravar o nome de cada arquivo que é alterado para um canal nomeado. A seguir, os arquivos Markdown serão convertidos no diretório atual para HTML, conforme forem editados

$ ls *.md | entr +/tmp/notify &
$ while read F
> do
>   markdown2html $F
> done < /tmp/notify
    
por 04.07.2013 / 06:33