Gli editor possono seguire diverse strategie per salvare un file. Le due varianti principali sono quelle di sovrascrivere il file esistente o di scrivere in un nuovo file e spostarlo in posizione. Scrivere su un nuovo file e spostarlo in posizione ha la bella proprietà che in qualsiasi momento, leggere dal file ti dà una versione completa del file (un istante il vecchio, il prossimo istante il nuovo). Se il file viene sovrascritto sul posto, c'è un tempo durante il quale è incompleto, il che è problematico se qualche altro programma vi accede in quel momento o se il sistema si arresta in modo anomalo.
Apparentemente Nano sovrascrive il file esistente. La tua sceneggiatura rileva il punto in cui ha finito di scrivere (l' close_write
evento) e viene eseguita rsync
a quel punto. Si noti che è possibile per rsync acquisire una versione incompleta del file, se si salva due volte in rapida successione, prima che rsync abbia completato il suo lavoro dal primo salvataggio.
Vim, d'altra parte, usa la strategia di scrittura e di spostamento, qualcosa a effetto di
echo 'new content' >somefile.new
mv -f somefile.new somefile
Quello che succede alla vecchia versione del file è che viene eliminato nel punto in cui viene spostata la nuova versione. A questo punto, il inotifywait
comando ritorna, perché il file che gli è stato detto di guardare non esiste più. (Il nuovo somefile
è un file diverso con lo stesso nome.) Se Vim fosse stato configurato per creare un file di backup, cosa accadrebbe sarebbe qualcosa di simile
echo 'new content' >somefile.new
ln somefile somefile.old
mv -f somefile.new somefile
e inotifywait
ora starebbe guardando il backup.
Per ulteriori informazioni sulle strategie di salvataggio dei file, vedere Come è possibile eseguire un aggiornamento live mentre un programma è in esecuzione? e autorizzazioni e salvataggio dei file
Si può dire a Vim di usare la strategia di sovrascrittura: disattivare l' backupcopy
opzione ( :set nobackupcopy
). Questo è rischioso, come indicato sopra.
Per gestire entrambe le strategie di salvataggio, guarda la directory e filtra sia gli eventi close_write
che gli moved_to
eventi somefile
.
inotifywait -m -e close_write,moved_to --format %e/%f . |
while IFS=/ read -r events file; do
if [ "$file" = "somefile" ]; then
…
fi
done