Người chỉnh sửa có thể theo một số chiến lược để lưu tệp. Hai biến thể chính là ghi đè lên tệp hiện có hoặc ghi vào tệp mới và di chuyển nó vào vị trí. Viết vào một tệp mới và di chuyển nó vào vị trí có một đặc tính tốt là tại bất kỳ thời điểm nào, việc đọc từ tệp sẽ cung cấp cho bạn một phiên bản hoàn chỉnh của tệp (một bản tức là bản cũ, bản tiếp theo là bản mới). Nếu tệp được ghi đè tại chỗ, có một thời gian trong đó nó không đầy đủ, đó là vấn đề nếu một số chương trình khác truy cập vào nó ngay sau đó hoặc nếu hệ thống gặp sự cố.
Nano dường như ghi đè lên tập tin hiện có. Kịch bản của bạn phát hiện điểm khi nó viết xong ( close_write
sự kiện) và chạy rsync
tại điểm đó. Lưu ý rằng rsync có thể lấy một phiên bản chưa hoàn chỉnh của tệp, nếu bạn lưu hai lần liên tiếp, trước khi rsync hoàn thành công việc của mình từ lần lưu đầu tiên.
Vim, mặt khác, sử dụng chiến lược viết rồi di chuyển - một cái gì đó ảnh hưởng đến
echo 'new content' >somefile.new
mv -f somefile.new somefile
Điều xảy ra với phiên bản cũ của tệp là nó bị xóa tại thời điểm phiên bản mới được di chuyển vào vị trí. Tại thời điểm này, inotifywait
lệnh trả về, vì tệp được bảo là không còn tồn tại. (Cái mới somefile
là một tệp khác có cùng tên.) Nếu Vim đã được cấu hình để tạo tệp sao lưu, điều sẽ xảy ra là một cái gì đó như
echo 'new content' >somefile.new
ln somefile somefile.old
mv -f somefile.new somefile
và inotifywait
bây giờ sẽ xem bản sao lưu.
Để biết thêm thông tin về các chiến lược lưu tệp, hãy xem Làm thế nào có thể thực hiện cập nhật trực tiếp trong khi chương trình đang chạy? và quyền và lưu tệp
Vim có thể được yêu cầu sử dụng chiến lược ghi đè: tắt backupcopy
tùy chọn ( :set nobackupcopy
). Điều này là rủi ro, như chỉ ra ở trên.
Để xử lý cả hai chiến lược lưu, hãy xem thư mục và lọc cả hai close_write
và moved_to
các sự kiện cho somefile
.
inotifywait -m -e close_write,moved_to --format %e/%f . |
while IFS=/ read -r events file; do
if [ "$file" = "somefile" ]; then
…
fi
done