Um script bash pode ser conectado a um arquivo?

32

Quero que um script durma, 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 maneira elegante? A coisa mais simples que me vem à cabeça é um loop que dorme por um tempo antes de verificar o status novamente, mas talvez haja uma maneira mais elegante?

Tobias Kienzler
fonte

Respostas:

34

No linux, você pode usar o inotifyrecurso do kernel . As ferramentas para script podem ser encontradas aqui: 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...
shellholic
fonte
1
A maioria dos escritórios possui um recurso semelhante. Infelizmente, cada um tem sua própria interface e muitos não têm API de shell.
Gilles 'SO- stop be evil'
4

Existe uma API chamada inotify para programadores C.

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

Mikel
fonte
Tremendo, é isso mesmo. Saúde Mikel!
Paul D. Waite
3

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

edit: alguns exemplos

Reconstruir se os arquivos de origem mudarem

$ find *.c | entr make

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

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

O fornecimento de um documento +/path/to/fifopermite scripts mais complexos, instruindo entra escrever o nome de cada arquivo que muda para um canal nomeado. A seguir, os arquivos do Markdown no diretório atual serão convertidos para HTML, à medida que forem editados

$ ls *.md | entr +/tmp/notify &
$ while read F
> do
>   markdown2html $F
> done < /tmp/notify
eradman
fonte
Intrigante, mas estranho. Então ... ele lê vários nomes de arquivos na entrada padrão e executa o comando especificado quando um deles é alterado?
Tripleee
Parece interessante, obrigado! Existe alguma maneira de entrpassar o nome do arquivo que também foi alterado?
Tobias Kienzler
A partir da versão 2.7, o /_argumento especial (parecido com $_ no Perl) é substituído pelo nome do primeiro arquivo que foi alterado
eradman