Bir bash betiği bir dosyaya bağlanabilir mi?


32

Bir komut dosyasının belirli bir dosya değiştirilmediği / silinmediği (veya belirli bir dizinde oluşturulan dosya veya ...) olmadığı sürece uyumasını istiyorum. Bu, zarif bir şekilde başarılabilir mi? Aklıma gelen en basit şey, durumu tekrar kontrol etmeden önce bir süre uyuyan bir döngü, ama belki daha zarif bir yol var?

Yanıtlar:


34

Linux'ta çekirdeğin inotifyözelliğini kullanabilirsiniz. Komut dosyası oluşturma araçları burada bulunabilir: inotify-tools .

Wiki'den örnek kullanım:

#!/bin/sh

EVENT=$(inotifywait --format '%e' ~/file1) # blocking without looping
[ $? != 0 ] && exit
[ "$EVENT" = "MODIFY" ] && echo 'file modified!'
[ "$EVENT" = "DELETE_SELF" ] && echo 'file deleted!'
# etc...

1
Çoğu birlik benzer bir özelliğe sahiptir. Ne yazık ki her birinin kendi arayüzü var ve çoğunun kabuk API'si yok.
Gilles 'SO- kötülük'


3

Aslında, var: entr (1) , dosyalar değiştiğinde rasgele komutlar çalıştırır ve ayrıca uygulama sunucularını yeniden başlatmak için otomatik olarak yeniden yükleme seçeneği sunar.

düzenleme: bazı örnekler

Kaynak dosyaları değişirse yeniden oluştur

$ find *.c | entr make

Dosyalar değişirse test sunucusunu başlatın ve otomatik olarak yeniden yükleyin

$ ls *.py | entr -r python main.py

Bir değişkeni sağlamak, adlandırılmış bir boruya dönüşen her bir dosyanın adını yazarak +/path/to/fifotalimat entrvererek daha karmaşık komut dosyalarına izin verir . Aşağıdakiler geçerli dizindeki Markdown dosyalarını düzenlendikleri gibi HTML'ye dönüştürecektir.

$ ls *.md | entr +/tmp/notify &
$ while read F
> do
>   markdown2html $F
> done < /tmp/notify

İlgi çekici, ama garip. Yani ... standart girişte bir sürü dosya adı okuyor ve bunlardan biri değiştiğinde belirtilen komutu çalıştırıyor mu?
üçlü,

İlginç görünüyor, teşekkürler! entrDeğişen dosyanın ismini de geçmenin bir yolu var mı?
Tobias Kienzler

2.7 sürümünden itibaren, özel /_argüman ( $Perl'de
_'e benzeyen)
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.