Comment exécuter une commande Linux lorsqu'un ensemble de fichiers change

0
174
Gecko Studio/Shutterstock.com

En savoir plus comment exécuter des commandes Linux lorsqu'un fichier dans un ensemble de fichiers surveillé change et lorsque de nouveaux fichiers sont créés. Nous vous montrons comment utiliser cet outil flexible.

La commande entr

Vous pouvez définir des commandes à exécuter à des moments spécifiques sous Linux, à l'aide de cron. C'est simple, fiable et flexible. Mais que se passe-t-il si vous devez exécuter des commandes chaque fois qu'un fichier change ou si un nouveau fichier est ajouté à un répertoire ? C'est aussi possible, et il y a plus d'une façon de le faire. La commande entr est un moyen simple et rafraîchissant d'obtenir cette fonctionnalité.

Certains systèmes, tels que le générateur de site statique Hugo, disposent d'une fonctionnalité qui reconstruit automatiquement votre site Web si un fichier change ou si un nouveau fichier est ajouté au site. Cette petite fonctionnalité fait une différence significative dans votre flux de travail. Avec Hugo, vous pouvez avoir votre version de développement du site Web dans votre navigateur lorsque vous modifiez les fichiers qui composent votre site. Chaque fois que vous enregistrez vos modifications ou créez un fichier, le site Web est reconstruit en quelques millisecondes et les modifications sont transmises à votre navigateur. La rétroaction instantanée est fantastique.

La commande entr apporte ce type de capacité à n'importe quel ensemble de fichiers. La commande qui est lancée lorsqu'un changement est détecté est arbitraire. Il peut s'agir d'une commande Linux standard, d'un alias, d'une fonction shell ou d'un script.

Installation d'entr

Pour installer entr sur Ubuntu, utilisez cette commande :

sudo apt-get install entr

Pour installer entr sur Fedora, tapez :

sudo dnf install entr

Sur Manjaro, la commande est :

sudo pacman -Syu entr

Un exemple simple

Nous utiliserons la commande tactile pour créer un fichier texte appelé “example.txt” et dites à entr de surveiller ce fichier.

Publicité

La commande entr accepte les noms de fichiers qu'elle doit surveiller via STDIN et accepte la commande qu'elle doit exécuter comme paramètres de ligne de commande.

Le le moyen le plus simple de passer un nom de fichier à entr est d'utiliser ls pour le répertorier et de le diriger dans entr. Lorsque le fichier change, entr lancera la commande wc pour compter les lignes, les mots et les caractères du fichier.

Le paramètre /_ est un espace réservé pour le nom de fichier du fichier qui a été transmis à entr. Si un groupe de fichiers est passé à entr, tel que *.txt , le paramètre /_ sera remplacé par le dernier fichier à être modifié.

touch example.txt ls example.txt | entr wc /_

Chaque fois que les modifications sont enregistrées dans le fichier, entr lance wc . Pour arrêter entr, appuyez sur q ou Ctrl+c .

CONNEXION : Qu'est-ce que stdin, stdout et stderr sous Linux ?

Utilisations pratiques

Maintenant que nous avons vu entr en action et que vous comprenez le principe, examinons quelques scénarios plus utiles.

Nous allons faire en sorte que entr surveille les fichiers dans le répertoire courant. . Si l'un des fichiers est modifié, nous voulons qu'entr lance make pour que nous puissions reconstruire notre projet. Nous allons enchaîner une autre commande, make test, pour exécuter des tests sur la nouvelle version. L'opérateur AND && ne lancera la deuxième commande que si la première se termine sans aucun problème.

Publicité

L'option -s (shell) permet de s'assurer que l'interpréteur utilisé est celui défini dans la variable d'environnement SHELL. Cela garantit que entr reçoit le code de sortie de la première commande make.

ls | entr -s 'faire && faire le test'

L'utilisation de la commande ls pour envoyer la liste de tous les noms de fichiers du répertoire à entr est un peu maladroit. Vous pouvez avoir des fichiers dans le répertoire qui font partie du projet mais qui ne sont pas réellement des fichiers de construction. Ce sont peut-être des notes de conception ou une liste de choses à faire. Vous n'avez pas besoin de reconstruire votre projet à chaque fois que vous modifiez l'un de ces fichiers non codés.

Nous pouvons affiner la commande afin qu'elle ne surveille que les fichiers de code source appropriés. Cette commande surveille le code source C et les fichiers d'en-tête.

ls *.[ch] | entr -s 'faire && make test'

Bien sûr, nous ne sommes pas limités à lancer make. Vous préférez peut-être utiliser un script de construction personnalisé.

ls *.[ch] | entr script.sh

Utilisation de Git

La commande entr n'est pas Gitware, mais nous pouvons toujours utiliser certaines des capacités de Git pour fluidifier notre flux de travail.

La commande git ls-file listera les fichiers qui se trouvent dans L'index et l'arborescence des sources de travail de Git, en tenant compte des exceptions qui ont été définies dans votre fichier “.gitignore” déposer. C'est une liste toute prête des fichiers qui nous intéressent, alors utilisons-la comme source des fichiers à surveiller.

git ls-files | entr script.sh Publicité

La commande ls-files accepte les options de ligne de commande. Ceux-ci peuvent être utilisés pour filtrer davantage ou augmenter la liste de fichiers renvoyée par Git :

  • -c : afficher les fichiers mis en cache.
  • -d : afficher les fichiers supprimés.
  • -m : afficher les fichiers modifiés.
  • -o : afficher fichiers non suivis.

L'option –exclude-standard est un raccourci pour dire à Git d'ignorer les fichiers qui correspondent aux entrées du fichier “.git/info/exclude” , local “.gitignore” et global “.gitignore” fichiers.

git ls-files -cdmo –exclude-standard | entr 'faire && make test'

Cela va attraper beaucoup d'éventualités, mais cela ne supportera pas la création d'un nouveau fichier. Et le nouveau fichier ne sera pas dans Git. Nous pouvons toujours faire face à cette situation, en utilisant un peu de script Bash et une fonctionnalité d'entr.

L'option -d (répertoire) force entr à surveiller les fichiers dans un répertoire et à quitter si un nouveau fichier est ajouté. En enveloppant notre commande entr dans une boucle while/do, toute la ligne de commande entr sera automatiquement redémarrée et le nouveau fichier sera récupéré et traité. Fichiers et répertoires dont les noms commencent par un point “.” sont ignorés.

tant que true; do { git ls-files; git ls-files . –exclude-standard –others; } | entr -d ./script.sh done

Redémarrage des serveurs et des interprètes

Peut-être travaillez-vous avec un langage interprété comme Ruby. Chaque fois que votre fichier programme est modifié, vous devez arrêter et redémarrer l'interpréteur Ruby. Vous pouvez gérer ces types de cas d'utilisation avec l'option -r (redémarrer).

Pour surveiller un fichier programme appelé “hello_world.rb”, et pour arrêter et redémarrer l'interpréteur Ruby chacun fois que le fichier programme change, utilisez cette commande :

ls hello_world.rb | entr -r ruby ​​hello_world.rb Publicité

Chaque fois que le fichier programme est édité et enregistré, l'interpréteur Ruby est redémarré et le programme rechargé.

Le programme contenait initialement :

met “Hello, World!”

Il a été modifié pour dire :

met “Bonjour, CloudSavvyIT !”

Lorsque cela a été enregistré, entr a redémarré l'interpréteur Ruby et a rechargé le programme.

Le fichier a été modifié une fois de plus pour ajouter le mot “lecteurs” et enregistré sur le disque dur.

met “Bonjour, lecteurs CloudSavvyIT !”

Vous pouvez voir les trois sorties dans la capture d'écran. Si vous appuyez sur la barre d'espace, entr redémarrera la commande, que vous ayez modifié ou non le fichier programme.

Pas seulement pour les programmeurs

Parce que la commande lancée par entr peut être quoi que ce soit, y compris les scripts shell, la possibilité d'utiliser entr pour automatiser les processus est pratiquement illimitée.

Peut-être avez-vous un répertoire dans lequel des fichiers sont déposés par FTP sécurisé, ou rsync, ou curl. Vous pouvez faire copier automatiquement ces fichiers ailleurs, les compresser ou les rechercher par grep pour le mot “error”.

Publicité

Cela en fait un excellent outil pour les administrateurs système et les développeurs.