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
- il video su YouTube
- esempi e comandi della puntata su GitHub
- entr, sito ufficiale
- entr(1) — la man page
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!
