편집자는 몇 가지 전략에 따라 파일을 저장할 수 있습니다. 두 가지 주요 변형은 기존 파일을 덮어 쓰거나 새 파일에 쓰고 제자리로 옮기는 것입니다. 새 파일에 쓰고 제자리로 옮기면 파일에서 읽을 때 파일의 전체 버전을 제공하는 좋은 속성이 있습니다 (하나는 이전 파일, 다음은 새로운 파일). 파일을 덮어 쓰면 파일이 불완전한 시간이있어 다른 프로그램이 파일에 액세스하거나 시스템이 충돌하는 경우 문제가됩니다.
Nano는 기존 파일을 덮어 씁니다. 스크립트는 쓰기가 완료된 시점 ( close_write
이벤트)을 감지하고 rsync
해당 시점에서 실행됩니다 . rsync가 첫 번째 저장에서 작업을 완료하기 전에 rsync가 파일의 불완전한 버전을 빠르게 두 번 저장하는 경우 rsync가 파일의 불완전한 버전을 가져올 수 있습니다.
반면에 Vim은 write-then-move 전략을 사용합니다.
echo 'new content' >somefile.new
mv -f somefile.new somefile
이전 버전의 파일에서 발생하는 일은 새 버전이 제자리로 이동되는 시점에서 파일이 삭제된다는 것입니다. 이 시점에서 inotifywait
감시하라는 파일이 더 이상 존재하지 않기 때문에 명령이 반환됩니다. (새 somefile
파일은 이름이 같은 다른 파일입니다.) Vim이 백업 파일을 만들도록 구성된 경우 다음과 같은 결과가 발생합니다.
echo 'new content' >somefile.new
ln somefile somefile.old
mv -f somefile.new somefile
그리고 inotifywait
지금 백업을 지켜보고있을 것이다.
파일 저장 전략에 대한 자세한 내용 은 프로그램이 실행되는 동안 어떻게 실시간 업데이트를 수행 할 수 있습니까?를 참조하십시오. 및 파일 권한 및 저장
Vim은 덮어 쓰기 전략을 사용하도록 지시 할 수 있습니다 . backupcopy
옵션 을 끄십시오 ( :set nobackupcopy
). 위에 표시된대로 이는 위험합니다.
두 가지 저장 전략을 모두 처리하려면 디렉토리를보고 이벤트 close_write
와를 모두 필터링하십시오 .moved_to
somefile
inotifywait -m -e close_write,moved_to --format %e/%f . |
while IFS=/ read -r events file; do
if [ "$file" = "somefile" ]; then
…
fi
done