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.