Vim ile birlikte inotifywait kullanma


14

Dosya değişiklikleri için izler ve uzak kopya ile rsyncs basit komut dosyası var:

#!/bin/bash

while inotifywait -e close_write somefile
do
    rsync somefile user@host.domain:./somefile
done

Nano ile gayet iyi çalışıyor, ama vim ile başarısız. Nano kullandığımda çıktı:

somefile CLOSE_WRITE,CLOSE   

ve başka bir sürümü beklemek için bir sonraki döngüyü başlatır.

Ben vim kullandığımda, çıktı yok, komut dosyası sadece çıkış kodu 0 ile kapanır.

Biraz araştırma yaptım ve close_write initofywait vim (ilk ben değiştirmek olayı kullanmak istedim) ile birlikte uing için doğru parametre olduğunu öğrendim, ama bazı nedenlerden dolayı benim için başarısız.


Benim için çalışıyor. Dedin değiştirmek kaydederek yerine sadece düzenleme için açmadan önce vim dosya?
roaima

@roaima Yalnızca backupcopyseçenek kapalıysa çalışır.
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


15

Editörler bir dosyayı kaydetmek için çeşitli stratejileri takip edebilir. İki büyük varyant mevcut dosyanın üzerine yazmak veya yeni bir dosyaya yazmak ve yerine taşımaktır. Yeni bir dosyaya yazmak ve onu taşımak, herhangi bir zamanda dosyadan okumak size dosyanın tam bir sürümünü (bir an eski, bir sonraki an, yeni bir) veren güzel bir özelliğe sahiptir. Dosyanın üzerine yazılırsa, eksik bir süre vardır, bu da başka bir programın dosyaya erişmesi veya sistem çökmesi durumunda sorunludur.

Nano görünüşe göre mevcut dosyanın üzerine yazıyor. Komut dosyanız, yazmayı ( close_writeolay) tamamladığında noktayı algılar ve rsynco noktada çalışır . Rsync'in işini ilk kayıttan tamamlamadan önce, iki kez hızlı bir şekilde kaydederseniz, rsync'in dosyanın eksik bir sürümünü alabileceğini unutmayın.

Öte yandan Vim, yaz-sonra-taşı stratejisini kullanır -

echo 'new content' >somefile.new
mv -f somefile.new somefile

Dosyanın eski sürümüne olan şey, yeni sürümün yerine taşındığı noktada silinmesidir. Bu noktada inotifywaitkomut geri döner, çünkü izlemesi söylenen dosya artık mevcut değildir. (Yeni somefile, aynı ada sahip farklı bir dosyadır.) Vim bir yedekleme dosyası yapmak üzere yapılandırılmış olsaydı, ne olurdu

echo 'new content' >somefile.new
ln somefile somefile.old
mv -f somefile.new somefile

ve inotifywaitşimdi yedeklemeyi izliyor olacaklardı.

Dosya kaydetme stratejileri hakkında daha fazla bilgi için bkz. Bir program çalışırken canlı güncelleştirme nasıl yapılabilir? ve Dosya izinleri ve kaydetme

Vim'in üzerine yazma stratejisini kullanması söylenebilir: backupcopy( :set nobackupcopy) seçeneğini kapatın . Yukarıda belirtildiği gibi bu risklidir.

Stratejileri tasarrufu hem işlemek için dizin izlemek ve her iki filtre close_writeve moved_toolayları somefile.

inotifywait -m -e close_write,moved_to --format %e/%f . |
while IFS=/ read -r events file; do
  if [ "$file" = "somefile" ]; then
    …
  fi
done

Burada önerilen yöntemin dezavantajı, "bir kerede" birden fazla dosya yazdığınızda, komutlarınızın her dosya için bir kez çalıştırılmasıdır. Ben kodu düzenliyorum, bu yüzden bir başlık ve diğer birkaç çeviri birimini değiştirebilir ve :wa. Sonra benim derleme yazılı her dosya için bir kez çalıştırılır.
Sınırlı Kefaret

@LimitedAtonement Bu, kullanım sorusunu bu sorudakinden çok daha karmaşık hale getirir. Kullanım durumunuz için, bir dosya kaydedildikten sonra biraz beklemeniz gerekir. Dosyalar hiçbir zaman “bir kerede” gerçekten değiştirilmez. :waİle birden fazla dosya kaydederseniz art arda inotify olayları alırsınız. Başkalarının gelip gelmediğini görmek için ilkinden sonra beklemeniz gerekir. Ancak burada sunulan kodu kullanabilirsiniz: ek karmaşıklık içine girer .
Gilles 'SO- kötü olmayı bırak

@Gilles gibi karar verdim while true; do inotifywait ... [no -m]; make; sleep .1; done;. Bazı yakalar var, ama oldukça uygulanabilir bir şeye vardım.
Sınırlı Kefaret
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.