GNU/Linux: monitorare i file con entr

Il comando di oggi è particolarmente utile: permette di eseguire un comando, o uno script, ogni volta che cambia un file che decidiamo di sorvegliare. Si chiama entr e si installa con apt:

sudo apt install entr

Come funziona

entr vuole in input il nome di un file, o una lista di file, e su quei file si mette in ascolto delle modifiche. Quando un file cambia, esegue il comando che gli abbiamo passato come argomento. Sembra astratto, ma con un esempio diventa chiaro.

L’esempio: una mucca che avvisa

Creiamo un file di testo da sorvegliare, file-changing.txt. Poi uno script che scrive una notifica a terminale quando il file cambia. Per rendere la notifica più divertente uso cowsay, il comando bonus della puntata:

sudo apt install cowsay

Lo script si chiama changing-script.sh. Va reso eseguibile con chmod +x e questo è il contenuto intero:

#!/bin/bash

clear

/usr/games/cowsay "ciao! hai modificato $( basename $1)"

exit 0

Nota: cowsay non è nel path normale, perché viene installato in /usr/games, quindi lo chiamo con il percorso completo.

Lo script dice ciao con la mucca e mostra il nome del file passato come primo argomento ($1), di cui tengo solo il nome con basename.

Lanciare entr

Il nome del file da sorvegliare si passa a entr con una pipe, e dopo il nome di entr si scrive il comando da eseguire. In forma semplice:

echo file-changing.txt | entr ./changing-script.sh &

entr da solo occupa il terminale, quindi lo mando in background con la e commerciale (ne parlo nella puntata sul background). Così il terminale resta libero.

Due cose da notare. Appena parte, entr esegue subito lo script una volta: potrebbe non essere quello che vogliamo. Poi, ogni volta che modifico il file, lo script viene rilanciato:

echo "prova 3" > file-changing.txt

e la mucca ricompare. Questo finché non termino il processo di entr, che si vede ancora in esecuzione con:

ps aux | grep entr

Per toglierlo di mezzo basta kill, o killall entr.

Le opzioni -c e -p

Scrivo meglio la riga di comando con due opzioni:

  • -c pulisce lo schermo prima di ogni esecuzione;
  • -p non esegue il comando all’avvio di entr, ma solo alla prima modifica del file.
echo file-changing.txt | entr -p ./changing-script.sh &

Così è molto più pulito.

Passare il nome del file allo script

L’ultima cosa: entr può passare allo script il nome del file modificato. Basta indicare come argomento il segnaposto /_ , che entr sostituisce con il percorso del file. Nel nostro script lo leggiamo come $1. Il comando diventa:

echo file-changing.txt | entr -p bash ./changing-script.sh /_ &

La mucca ora dice anche il nome del file cambiato. È comodo quando lo script deve fare qualcosa proprio su quel file, per esempio rilanciare una query sul database ogni volta che il file SQL cambia.

A cosa serve davvero

Oltre alle mucche, entr serve a lanciare compilazioni, test, svuotare cache o rigenerare documenti ogni volta che salvi un file di lavoro. Una volta nella tua cassetta degli attrezzi, non ne farai più a meno.

In sintesi

  • echo file | entr comando: esegue il comando a ogni modifica;
  • & lo manda in background, killall entr lo ferma;
  • -c pulisce lo schermo, -p salta l’esecuzione iniziale;
  • /_ passa al comando il nome del file modificato.

Link e risorse

Sostieni il canale

PER SOSTENERE IL CANALE BASTANO UN LIKE E UN’ISCRIZIONE!
ma se vuoi offrirmi un caffè, mi aiuterà a rimanere sveglio mentre registro i video 😁☕
clicca qui per scoprire come https://buymeacoffee.com/thelinuxnerd

questi link sono affiliati Amazon, acquistando i libri che ti consiglio sostieni il canale!