編集者は、いくつかの戦略に従ってファイルを保存できます。2つの主な変種は、既存のファイルを上書きするか、新しいファイルに書き込んで所定の場所に移動することです。新しいファイルへの書き込みとその場所への移動には、任意の時点でファイルから読み取ることでファイルの完全なバージョン(1つのインスタントが古いファイル、次のインスタントが新しいファイル)を提供するという素晴らしい特性があります。ファイルが所定の場所に上書きされると、ファイルが不完全になる時間があります。それは、他のプログラムがそのファイルにアクセスした場合やシステムがクラッシュした場合に問題となります。
ナノは明らかに既存のファイルを上書きします。スクリプトは、書き込みが終了した時点(close_write
イベント)を検出し、その時点で実行rsync
します。rsyncが最初の保存からジョブを完了する前に、2回続けて保存すると、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