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?

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...

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'


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.