Editor dapat mengikuti beberapa strategi untuk menyimpan file. Dua varian utama adalah menimpa file yang ada, atau menulis ke file baru dan memindahkannya di tempat. Menulis ke file baru dan memindahkannya di tempat memiliki properti bagus yang setiap saat membaca dari file memberi Anda versi lengkap file (satu instan yang lama, instan berikutnya yang baru). Jika file ditimpa di tempat, ada waktu di mana itu tidak lengkap, yang bermasalah jika beberapa program lain mengaksesnya saat itu atau jika sistem crash.
Nano rupanya menimpa file yang ada. Script Anda mendeteksi titik ketika selesai menulis ( close_writeacara) dan berjalan rsyncpada titik itu. Perhatikan bahwa rsync dimungkinkan untuk mengambil versi file yang tidak lengkap, jika Anda menyimpan dua kali berturut-turut dengan cepat, sebelum rsync menyelesaikan tugasnya dari penyimpanan pertama.
Vim, di sisi lain, menggunakan strategi write-then-move - sesuatu yang berpengaruh
echo 'new content' >somefile.new
mv -f somefile.new somefile
Apa yang terjadi pada versi file yang lama adalah file itu dihapus pada titik di mana versi baru dipindahkan ke tempatnya. Pada titik ini, inotifywaitperintah kembali, karena file yang diperintahkan untuk ditonton tidak lagi ada. (Yang baru somefileadalah file yang berbeda dengan nama yang sama.) Jika Vim telah dikonfigurasi untuk membuat file cadangan, apa yang akan terjadi adalah sesuatu seperti
echo 'new content' >somefile.new
ln somefile somefile.old
mv -f somefile.new somefile
dan inotifywaitsekarang akan menonton cadangan.
Untuk informasi lebih lanjut tentang strategi penyimpanan file, lihat Bagaimana melakukan pembaruan langsung saat program sedang berjalan? dan Izin file dan penyimpanan
Vim dapat diperintahkan untuk menggunakan strategi timpa: matikan backupcopyopsi ( :set nobackupcopy). Ini berisiko, seperti ditunjukkan di atas.
Untuk menangani kedua strategi simpan, perhatikan direktori dan filter keduanya close_writeserta moved_toacara somefile.
inotifywait -m -e close_write,moved_to --format %e/%f . |
while IFS=/ read -r events file; do
if [ "$file" = "somefile" ]; then
…
fi
done