GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menjalankan perintah setiap kali file berubah?

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.


Linux
  1. Cara Menyimpan Output Perintah ke File di Linux

  2. Bagaimana saya bisa memeriksa file yang ada dan menjalankan perintah jika tidak?

  3. Bagaimana cara menambahkan output ke file?

  1. Cara menghasilkan sebagian checksum dari suatu file

  2. Bagaimana cara mengeksekusi file PL di Linux?

  3. Perintah Shell untuk memantau perubahan dalam file

  1. Bagaimana Cara Mengambil Sampel Secara Acak Dari Sebuah File?

  2. Jalankan Perintah Di Mana File Ditemukan?

  3. Cara mengeksekusi file python di linux