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_write
acara) dan berjalan rsync
pada 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, inotifywait
perintah kembali, karena file yang diperintahkan untuk ditonton tidak lagi ada. (Yang baru somefile
adalah 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 inotifywait
sekarang 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 backupcopy
opsi ( :set nobackupcopy
). Ini berisiko, seperti ditunjukkan di atas.
Untuk menangani kedua strategi simpan, perhatikan direktori dan filter keduanya close_write
serta moved_to
acara somefile
.
inotifywait -m -e close_write,moved_to --format %e/%f . |
while IFS=/ read -r events file; do
if [ "$file" = "somefile" ]; then
…
fi
done