Comment exécuter une commande Linux lorsqu’un ensemble de fichiers change –
Apprenez à exécuter des commandes Linux lorsqu’un fichier d’un ensemble de fichiers surveillé change et lorsque de nouveaux fichiers sont créés. Nous vous montrons comment utiliser cet outil flexible.
Sommaire
La commande entrée
Vous pouvez définir des commandes à exécuter à des moments spécifiques sous Linux, en utilisant 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. le 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, ont 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.
le entr
La commande 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 entrée
À installer entr
sur Ubuntu, utilisez cette commande :
sudo apt-get install entr
À installer entr
sur Fedora, tapez :
sudo dnf install entr
Sur Manjaro, la commande est :
sudo pacman -Syu entr
Un exemple simple
Nous allons utiliser la commande tactile pour créer un fichier texte appelé « example.txt » et dire entr
pour surveiller ce fichier.
le entr
La commande accepte les noms de fichiers qu’elle doit surveiller via STDIN
et accepte la commande qu’il doit exécuter en tant que paramètres de ligne de commande.
Le moyen le plus simple de transmettre un nom de fichier à entr
est d’utiliser ls
pour l’énumérer, et le mettre dans entr
. Lorsque le fichier change, entr
Va lancer wc
commande pour compter les lignes, les mots et les caractères du fichier.
le /_
le paramètre est un espace réservé pour le nom de fichier du fichier qui a été passé à entr
. Si un groupe de fichiers est transmis à entr
, tel que *.txt
, les /_
paramètre serait 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
. Arrêter entr
, frappé q
, ou alors Ctrl+c
.
Utilisations pratiques
Maintenant que nous avons vu entr
en action et que vous comprenez le principe, regardons quelques scénarios plus utiles.
nous ferons entr
surveiller les fichiers dans le répertoire courant. Si l’un des fichiers est modifié, nous voulons entr
lancer make
pour nous de reconstruire notre projet. Nous allons enchaîner une autre commande, make test
, pour exécuter des tests sur la nouvelle version. L’opérateur ET &&
ne lancera la deuxième commande que si la première se termine sans aucun problème.
le -s
(shell) permet de s’assurer que l’interpréteur utilisé est celui défini dans la variable d’environnement SHELL. Cela garantit entr
reçoit le code de sortie du premier make
commander.
ls | entr -s 'make && make test'
En utilisant le ls
commande pour envoyer la liste de tous les noms de fichiers dans le 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 tâches. 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 'make && make test'
Bien entendu, nous ne nous limitons pas à lancer make
. Vous pourriez avoir un script de construction personnalisé que vous préférez utiliser.
ls *.[ch] | entr script.sh
Tirer parti de Git
le entr
n’est pas Git-ware, mais nous pouvons toujours utiliser certaines des capacités de Git pour fluidifier notre flux de travail.
le git ls-file
La commande listera les fichiers qui se trouvent dans l’index de Git et l’arborescence des sources de travail, en tenant compte des exceptions qui ont été définies dans votre fichier « .gitignore ». C’est une liste toute faite des fichiers qui nous intéressent, alors utilisons-la comme source des fichiers à surveiller.
git ls-files | entr script.sh
le ls-files
La commande 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.
- -ré: Afficher les fichiers supprimés.
- -m: Afficher les fichiers modifiés.
- -o: Afficher les fichiers non suivis.
le --exclude-standard
L’option est un raccourci pour dire à Git d’ignorer les fichiers qui correspondent aux entrées dans les fichiers « .git/info/exclude », local « .gitignore » et global « .gitignore ».
git ls-files -cdmo --exclude-standard | entr 'make && make test'
Cela permettra de saisir de nombreuses éventualités, mais cela ne fera pas face à 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é de entr
.
le -d
(répertoire) option causes entr
pour surveiller les fichiers dans un répertoire et pour quitter si un nouveau fichier est ajouté. En emballant notre entr
commande dans un while/do
boucle, l’ensemble entr
La ligne de commande 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.
while 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 le -r
(redémarrer) option.
Pour surveiller un fichier programme appelé « hello_world.rb », et pour arrêter et redémarrer l’interpréteur Ruby chaque fois que le fichier programme change, utilisez cette commande :
ls hello_world.rb | entr -r ruby hello_world.rb
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 :
puts "Hello, World!"
Il a été édité pour dire :
puts "Hello, CloudSavvyIT!"
Lorsque cela a été enregistré, entr
redémarré l’interpréteur Ruby et rechargé le programme.
Le fichier a été modifié une fois de plus pour ajouter le mot « lecteurs » et enregistré sur le disque dur.
puts "Hello, CloudSavvyIT readers!"
Vous pouvez voir les trois sorties dans la capture d’écran. Si vous appuyez sur le spacebar
, entr
redémarrera la commande, que vous ayez modifié le fichier programme ou non.
Pas seulement pour les programmeurs
Parce que la commande lancée par entr
peut être n’importe quoi, y compris des scripts shell, la possibilité d’utiliser entr
automatiser les processus est pratiquement illimité.
Peut-être avez-vous un répertoire dans lequel des fichiers ont été déposés par FTP sécurisé, rsync ou curl. Vous pouvez faire copier automatiquement ces fichiers ailleurs, les compresser ou les rechercher par grep pour le mot « erreur ».
Cela en fait un excellent outil pour les administrateurs système et les développeurs.