Uno script bash può essere agganciato a un file?


32

Voglio che uno script venga sospeso a meno che un determinato file non venga modificato / eliminato (o un file creato in una determinata directory, o ...). Questo può essere ottenuto in qualche modo elegante? La cosa più semplice che mi viene in mente è un loop che dorme per un po 'di tempo prima di ricontrollare lo stato, ma forse c'è un modo più elegante?

Risposte:


34

Su Linux, puoi usare la funzionalità del kernel inotify. Gli strumenti per lo scripting sono disponibili qui: inotify-tools .

Esempio di utilizzo da wiki:

#!/bin/sh

EVENT=$(inotifywait --format '%e' ~/file1) # blocking without looping
[ $? != 0 ] && exit
[ "$EVENT" = "MODIFY" ] && echo 'file modified!'
[ "$EVENT" = "DELETE_SELF" ] && echo 'file deleted!'
# etc...

1
La maggior parte dei unice ha una funzione simile. Sfortunatamente ognuno ha la sua interfaccia e molti non hanno API della shell.
— Gilles 'SO- smetti di essere malvagio' il


3

Infatti c'è: entr (1) eseguirà comandi arbitrari quando cambiano i file e fornisce anche un'opzione di auto-ricarica per riavviare i server delle applicazioni.

modifica: alcuni esempi

Ricostruisci se i file di origine cambiano

$ find *.c | entr make

Avvia e ricarica automaticamente il server di prova se i file cambiano

$ ls *.py | entr -r python main.py

Fornire un agument +/path/to/fifoconsente script più complessi istruendo entra scrivere il nome di ciascun file che cambia in una pipe denominata. Quanto segue convertirà i file Markdown nella directory corrente in HTML mentre vengono modificati

$ ls *.md | entr +/tmp/notify &
$ while read F
> do
>   markdown2html $F
> done < /tmp/notify

Intrigante, ma strano. Quindi ... legge un sacco di nomi di file sull'input standard ed esegue il comando specificato quando uno di essi cambia?
— Tripleee

Sembra interessante, grazie! C'è un modo per far entrpassare anche il nome del file che è cambiato?
— Tobias Kienzler,

A partire dalla versione 2.7, l' /_argomento speciale (in qualche modo analogo a $_ in Perl) viene sostituito con il nome del primo file che è cambiato
— eradman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.