Un script bash peut-il être connecté à un fichier?

32

Je veux qu'un script soit mis en veille à moins qu'un certain fichier ne soit modifié / supprimé (ou un fichier créé dans un certain répertoire, ou ...). Cela peut-il être réalisé d'une manière élégante? La chose la plus simple qui me vienne à l’esprit est une boucle qui dort un certain temps avant de vérifier à nouveau le statut, mais peut-être qu’il existe un moyen plus élégant?

Tobias Kienzler
la source

Réponses:

34

Sous Linux, vous pouvez utiliser la fonctionnalité du noyau inotify. Les outils de script peuvent être trouvés ici: inotify-tools .

Exemple d'utilisation 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...
shellholic
la source
1
La plupart des unités ont une caractéristique similaire. Malheureusement, chacun a sa propre interface et beaucoup n'ont pas d'API shell.
Gilles 'SO- arrête d'être méchant'
4

Il existe une API appelée inotify pour les programmeurs C.

Certains outils l'utilisent, par exemple incron et inotify-tools .

Mikel
la source
Immense, c'est le truc. Salut Mikel!
Paul D. Waite
3

En effet, entr (1) exécute des commandes arbitraires lorsque les fichiers sont modifiés et fournit également une option de rechargement automatique pour le redémarrage des serveurs d'applications.

edit: quelques exemples

Reconstruire si les fichiers sources changent

$ find *.c | entr make

Lancer et recharger automatiquement le serveur de test si les fichiers changent

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

Fournir un document +/path/to/fifopermet des scripts plus complexes en demandant entrd'écrire le nom de chaque fichier qui devient un canal nommé. Ce qui suit convertira les fichiers Markdown du répertoire actuel en HTML au fur et à mesure de leur modification.

$ ls *.md | entr +/tmp/notify &
$ while read F
> do
>   markdown2html $F
> done < /tmp/notify
Eradman
la source
Intriguant, mais bizarre. Alors ... il lit un tas de noms de fichiers sur l'entrée standard et exécute la commande spécifiée lorsque l'un d'eux change?
triplee
Ça a l'air intéressant, merci! Existe-t-il un moyen de entrtransmettre le nom du fichier qui a également changé?
Tobias Kienzler
A partir de la version 2.7, l' /_argument spécial (quelque peu analogue à $_ dans Perl) est remplacé par le nom du premier fichier modifié
eradman