Come eseguire un comando Linux quando cambia un insieme di file

Contenuti

effetto domino.

Scopri come eseguire i comandi Linux quando un file in un set di file monitorato cambia e quando vengono creati nuovi file. Ti mostriamo come utilizzare questo strumento flessibile.

Il comando invio

Puoi configurare i comandi correre in orari specifici en Linux, usando cron. È facile, affidabile e flessibile. Ma, Cosa succede se è necessario eseguire comandi ogni volta che un file cambia o un nuovo file viene aggiunto a una directory?? Anche questo è fattibile, e c'è più di un modo per farlo. il entr il comando è a piacevolmente semplice modo per ottenere quella funzionalità.

Alcuni sistemi, Come la Generatore di siti statici Hugo, ha una funzione che ricostruisce automaticamente il tuo portale web se un file cambia o un nuovo file viene aggiunto al sito. Quella piccola caratteristica fa una differenza significativa per il tuo flusso di lavoro.. Con Hugo, puoi avere la tua versione di sviluppo del portale web nel tuo browser mentre modifichi i file che compongono il tuo sito. Ogni volta che salvi le tue modifiche o crei un file, il portale web si ricostruisce in millisecondi e le modifiche vengono inviate al tuo browser. Il feedback istantaneo è fantastico.

il entr Il comando offre quel tipo di funzionalità a qualsiasi set di file. Il comando che viene lanciato quando viene rilevata una modifica è arbitrario. Può essere un comando Linux standard, un alias, una funzione di shell o uno script.

Installazione ingresso

Installare entr in Ubuntu, usa questo comando:

sudo apt-get install entr

Installare entr in Fedora, scriba:

sudo dnf install entr

A Manjaro, il comando è:

sudo pacman -Syu enter

Un semplice esempio

Useremo il comando touch per creare un file di testo chiamato “ejemplo.txty decir entr per monitorare quel file.

il entr Il comando accetta i nomi dei file che dovrebbe monitorare tramite STDIN e accettare il comando da eseguire come parametri della riga di comando.

Il modo più semplice per passare un nome file a entr è da usare ls per elencarlo e incanalarlo in entr. Quando il file cambia, entr lo preparo io wc comando a conta le linee, parole e caratteri nel file.

il /_ Il parametro è un segnaposto per il nome del file a cui è stato passato entr. Se un gruppo di file viene passato a entr, come *.txt , il /_ Il parametro verrà sostituito dall'ultimo file da modificare.

tocca esempio.txt
ls esempio.txt | ingresso wc / _

Ogni volta che le modifiche vengono salvate nel file, entr lancia wc . Fermare entr, catturare q, oh Ctrl+c .

IMPARENTATO: Cosa sono gli standard, stdout e stderr in Linux?

Usi pratici

Ora che abbiamo visto entr in azione e comprendere il principio, diamo un'occhiata ad alcuni scenari più utili.

Volere entr monitorare i file nella directory corrente. Se uno qualsiasi dei file viene modificato, vogliamo entr pranzare make in modo che possiamo ricostruire il nostro progetto. Concateneremo un altro comando make test, per eseguire alcuni test sulla nuova build. L'operatore AND && avvierà il secondo comando solo se il primo viene completato senza problemi.

il -s L'opzione (guscio) assicura che l'interprete utilizzato sia quello definito nella variabile d'ambiente SHELL. Questo garantisce entr riceve il codice di uscita del primo make comando.

ls | entr -s 'make && fare la prova'

Usando il ls comando per inviare l'elenco di tutti i nomi di file nella directory a entr è un po' goffo. Potresti avere file nella directory che fanno parte del progetto ma non sono in realtà file di build. Forse sono note di progettazione o una lista di cose da fare. Non hai bisogno di ricostruire il tuo progetto ogni volta che cambi uno di quei file senza codice.

Possiamo perfezionare il comando in modo che controlli solo i file di codice sorgente appropriati. Questo comando monitora il codice sorgente C e i file di intestazione.

ls *.[ch] | entr -s 'make && fare la prova'

Certo, non ci limitiamo al lancio make. Potresti avere uno script di build personalizzato che preferisci usare.

ls *.[ch] | inserisci script.sh

Sfruttare Git

il entr il comando non è Git-ware, ma possiamo ancora usa alcune delle capacità di Git per rendere più fluido il nostro flusso di lavoro.

il git ls-file Il comando elencherà i file che si trovano nell'indice Git e nell'albero dei sorgenti di lavoro, teniendo en cuenta las excepciones que se han definido en su archivo “.gitignore”. Questo è un elenco preparato dei file che ci interessano, quindi usiamolo come sorgente dei file da monitorare.

git ls-files | inserisci script.sh

il ls-files Il comando accetta le opzioni della riga di comando. Questi possono essere usati per filtrare ulteriormente o aumentare l'elenco dei file restituiti da Git:

  • -C: Mostra i file nella cache.
  • -D: Mostra file cancellati.
  • -Metro: Mostra file modificati.
  • -oh: Mostra file non tracciati.

il --exclude-standard L'opzione è un modo abbreviato per dire a Git di ignorare i file che corrispondono alle voci nei "file .git / Informazioni / escludere", locale ".gitignore" e globale ".gitignore".

git ls-files -cdmo --exclude-standard | inserisci 'make && fare la prova'

Ciò rileverà molte eventualità, ma non funzionerà con la creazione di un nuovo file. E il nuovo file non sarà in Git. Possiamo ancora far fronte a quella situazione, usando un po' di script bash e una funzione di entr.

il -d (directory) cause di opzione entr per monitorare i file in una directory ed uscire se viene aggiunto un nuovo file. Avvolgendo il nostro entr comando in a while/do ciclo continuo, Tutto quanto entr La riga di comando si riavvierà automaticamente, e il nuovo file verrà selezionato e agito su. Archivos y directorios cuyos nombres comienzan con un punto."Sono ignorati".

mentre vero; fare

  { git ls-files; git ls-files . --standard di esclusione --altri; } | entr -d ./script.sh

done

Reinicio de servidores e intérpretes

Forse lavori con un lingua interpretata Come Rubino. Ogni volta che il file del programma viene modificato, dovresti fermare e riavviare l'interprete Ruby. Puoi gestire questi tipi di casi d'uso con il -r (ricomincia) opzione.

Para monitorear un archivo de programa llamadohello_world.rb”, e per fermare e riavviare l'interprete Ruby ogni volta che il file di programma cambia, usa questo comando:

ls ciao_mondo.rb | entr -r ruby ​​ciao_mondo.rb

Ogni volta che il file del programma viene modificato e salvato, l'interprete Ruby si riavvia e il programma si ricarica.

Il programma inizialmente conteneva:

mette "Ciao, Mondo!"

È stato modificato per dire:

mette "Ciao, CloudSavvyIT!"

Quando questo è stato salvato, entr riavviato l'interprete ruby ​​e ricaricato il programma.

El archivo se editó una vez más para agregar la palabralectoresy se guardó en el disco duro.

mette "Ciao, Lettori CloudSavvyIT!"

Puoi vedere le tre uscite nello screenshot. Se premi il spacebar, entr riavvierà il comando indipendentemente dal fatto che tu abbia modificato o meno il file del programma.

Non solo per i programmatori

Perché il comando lanciato da entr può essere qualsiasi cosa, inclusi gli script di shell, lo scopo da usare entr l'automazione dei processi è praticamente illimitata.

Forse hai una directory che contiene file inseriti da FTP sicuro, oh rsync, oh Riccio. Puoi fare in modo che questi file vengano copiati automaticamente altrove, sono compressi o cercati grep para la palabra “errore”.

Questo lo rende un ottimo strumento sia per gli amministratori di sistema che per gli sviluppatori..

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.