¿Se puede conectar un script bash a un archivo?

32

Quiero que se suspenda un script a menos que se modifique / elimine un determinado archivo (o un archivo creado en un determinado directorio, o ...). ¿Se puede lograr esto de alguna manera elegante? Lo más simple que me viene a la mente es un ciclo que duerme por un tiempo antes de volver a verificar el estado, pero ¿tal vez hay una forma más elegante?

Tobias Kienzler
fuente

Respuestas:

34

En Linux, puede usar la inotifyfunción del núcleo . Las herramientas para scripting se pueden encontrar allí: inotify-tools .

Ejemplo de uso de 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...
concha
fuente
1
La mayoría de las unidades tienen una característica similar. Desafortunadamente, cada uno tiene su propia interfaz y muchos no tienen API de shell.
Gilles 'SO- deja de ser malvado'
4

Hay una API llamada inotify para programadores en C.

Hay algunas herramientas que lo usan, por ejemplo, incron e inotify-tools .

Mikel
fuente
Tremenda, esas son las cosas. Saludos Mikel!
Paul D. Waite
3

De hecho, hay: entr (1) ejecutará comandos arbitrarios cuando cambien los archivos, y también proporciona una opción de recarga automática para reiniciar los servidores de aplicaciones.

editar: algunos ejemplos

Reconstruir si los archivos de origen cambian

$ find *.c | entr make

Inicie y recargue automáticamente el servidor de prueba si los archivos cambian

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

Proporcionar un elemento +/path/to/fifopermite la creación de secuencias de comandos más complejas al indicar entrque escriba el nombre de cada archivo que cambia a una tubería con nombre. Lo siguiente convertirá los archivos Markdown en el directorio actual a HTML a medida que se editan

$ ls *.md | entr +/tmp/notify &
$ while read F
> do
>   markdown2html $F
> done < /tmp/notify
eradman
fuente
Intrigante, pero extraño. Entonces ... ¿lee un montón de nombres de archivos en la entrada estándar y ejecuta el comando especificado cuando uno de ellos cambia?
tripleee
Parece interesante, gracias! ¿Hay alguna forma de entrpasar el nombre del archivo que también ha cambiado?
Tobias Kienzler
A partir de la versión 2.7, el /_argumento especial (algo análogo a $_ en Perl) se reemplaza con el nombre del primer archivo que cambió
eradman el