Editoren können verschiedene Strategien zum Speichern einer Datei anwenden. Die beiden Hauptvarianten bestehen darin, die vorhandene Datei zu überschreiben oder in eine neue Datei zu schreiben und sie an ihren Platz zu verschieben. Das Schreiben in eine neue Datei und das Verschieben an Ort und Stelle hat die nette Eigenschaft, dass Sie beim Lesen aus der Datei zu jedem Zeitpunkt eine vollständige Version der Datei erhalten (ein Augenblick der alte, der nächste Augenblick der neue). Wenn die Datei überschrieben wird, ist sie in einer bestimmten Zeit unvollständig. Dies ist problematisch, wenn gerade ein anderes Programm darauf zugreift oder das System abstürzt.
Nano überschreibt anscheinend die vorhandene Datei. Ihr Skript erkennt den Punkt, an dem es mit dem Schreiben fertig ist (das close_write
Ereignis) und wird rsync
an diesem Punkt ausgeführt. Beachten Sie, dass es für rsync möglich ist, eine unvollständige Version der Datei abzurufen, wenn Sie zweimal schnell hintereinander speichern, bevor rsync den Job vom ersten Speichern an abgeschlossen hat.
Auf der anderen Seite verwendet Vim die Write-then-Move-Strategie
echo 'new content' >somefile.new
mv -f somefile.new somefile
Was mit der alten Version der Datei passiert, ist, dass sie an dem Punkt gelöscht wird, an dem die neue Version eingefügt wird. Zu diesem Zeitpunkt wird der inotifywait
Befehl zurückgegeben, da die Datei, die überwacht werden soll, nicht mehr vorhanden ist. (Die neue somefile
Datei ist eine andere Datei mit demselben Namen.) Wenn Vim so konfiguriert worden wäre, dass eine Sicherungsdatei erstellt wird, würde so etwas passieren
echo 'new content' >somefile.new
ln somefile somefile.old
mv -f somefile.new somefile
und inotifywait
würde jetzt die Sicherung beobachten.
Weitere Informationen zu Dateispeicherstrategien finden Sie unter Wie kann ein Live-Update durchgeführt werden, während ein Programm ausgeführt wird? und Dateiberechtigungen und Speichern
Vim kann angewiesen werden, die Überschreibstrategie zu verwenden: Deaktivieren Sie die backupcopy
Option ( :set nobackupcopy
). Dies ist riskant, wie oben angegeben.
Um beide Speicherstrategien zu handhaben, beobachten Sie das Verzeichnis und filtern Sie beide close_write
und moved_to
Ereignisse nach somefile
.
inotifywait -m -e close_write,moved_to --format %e/%f . |
while IFS=/ read -r events file; do
if [ "$file" = "somefile" ]; then
…
fi
done