Sederhana, menggunakan inotifywait (instal inotify-tools
distribusi Anda paket):
while inotifywait -e close_write myfile.py; do ./myfile.py; done
atau
inotifywait -q -m -e close_write myfile.py |
while read -r filename event; do
./myfile.py # or "./$filename"
done
Cuplikan pertama lebih sederhana, tetapi memiliki kelemahan yang signifikan:cuplikan ini akan melewatkan perubahan yang dilakukan saat inotifywait
tidak berjalan (khususnya while myfile
sedang berlari). Cuplikan kedua tidak memiliki cacat ini. Namun, berhati-hatilah karena diasumsikan bahwa nama file tidak mengandung spasi. Jika itu masalah, gunakan --format
opsi untuk mengubah output agar tidak menyertakan nama file:
inotifywait -q -m -e close_write --format %e myfile.py |
while read events; do
./myfile.py
done
Apa pun itu, ada batasannya:jika beberapa program menggantikan myfile.py
dengan file yang berbeda, daripada menulis ke myfile
yang ada , inotifywait
akan mati. Banyak editor bekerja dengan cara itu.
Untuk mengatasi batasan ini, gunakan inotifywait
pada direktori:
inotifywait -e close_write,moved_to,create -m . |
while read -r directory events filename; do
if [ "$filename" = "myfile.py" ]; then
./myfile.py
fi
done
Sebagai alternatif, gunakan alat lain yang menggunakan fungsionalitas dasar yang sama, seperti incron (memungkinkan Anda mendaftarkan peristiwa saat file dimodifikasi) atau fswatch (alat yang juga bekerja pada banyak varian Unix lainnya, menggunakan analog setiap varian dari inotify Linux).
masuk (http://entrproject.org/) menyediakan antarmuka yang lebih ramah untuk inotify (dan juga mendukung *BSD &Mac OS X).
Sangat mudah untuk menentukan beberapa file untuk ditonton (hanya dibatasi oleh ulimit -n
), menghilangkan kerumitan berurusan dengan file yang diganti, dan membutuhkan lebih sedikit sintaks bash:
$ find . -name '*.py' | entr ./myfile.py
Saya telah menggunakannya di seluruh pohon sumber proyek saya untuk menjalankan pengujian unit untuk kode yang sedang saya modifikasi, dan ini sudah menjadi dorongan besar bagi alur kerja saya.
Bendera seperti -c
(hapus layar di antara proses) dan -d
(keluar saat file baru ditambahkan ke direktori yang dipantau) tambahkan lebih banyak fleksibilitas, misalnya Anda dapat melakukan:
$ while sleep 1 ; do find . -name '*.py' | entr -d ./myfile.py ; done
Pada awal 2018 masih dalam pengembangan aktif dan dapat ditemukan di Debian &Ubuntu (apt install entr
); membangun dari repo penulis tidak merepotkan.
Saya menulis sebuah program Python untuk melakukan persis seperti ini yang disebut when-changed.
Penggunaannya sederhana:
when-changed FILE COMMAND...
Atau untuk menonton banyak file:
when-changed FILE [FILE ...] -c COMMAND
FILE
dapat berupa direktori. Tonton secara rekursif dengan -r
. Gunakan %f
untuk meneruskan nama file ke perintah.