Bisakah skrip bash dikaitkan ke file?

32

Saya ingin skrip tidur kecuali file tertentu dimodifikasi / dihapus (atau file yang dibuat di direktori tertentu, atau ...). Bisakah ini dicapai dengan cara yang elegan? Hal paling sederhana yang muncul di benak saya adalah lingkaran yang tidur selama beberapa waktu sebelum memeriksa status lagi, tetapi mungkin ada cara yang lebih elegan?

Tobias Kienzler
sumber

Jawaban:

34

Di linux, Anda dapat menggunakan fitur kernel inotify. Alat untuk scripting dapat ditemukan di sana: inotify-tools .

Contoh penggunaan dari wiki:

#!/bin/sh

EVENT=$(inotifywait --format '%e' ~/file1) # blocking without looping
[ $? != 0 ] && exit
[ "$EVENT" = "MODIFY" ] && echo 'file modified!'
[ "$EVENT" = "DELETE_SELF" ] && echo 'file deleted!'
# etc...
shellholic
sumber
1
Sebagian besar persatuan memiliki fitur serupa. Sayangnya masing-masing memiliki antarmuka sendiri, dan banyak yang tidak memiliki API shell.
Gilles 'SANGAT berhenti menjadi jahat'
4

Ada API yang disebut inotify for programmer C.

Ada beberapa alat yang menggunakannya, misalnya alat incron dan inotify .

Mikel
sumber
Luar biasa, itu barangnya. Ceria Mikel!
Paul D. Waite
3

Memang ada: entr (1) akan menjalankan perintah sewenang-wenang ketika file berubah, dan juga menyediakan opsi auto-reload untuk me-restart server aplikasi.

sunting: beberapa contoh

Bangun kembali jika file sumber berubah

$ find *.c | entr make

Luncurkan dan muat ulang server pengujian jika file berubah

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

Memberikan agumen +/path/to/fifomemungkinkan skrip yang lebih kompleks dengan menginstruksikan entruntuk menulis nama setiap file yang berubah menjadi pipa bernama. Berikut ini akan mengonversi file penurunan harga di direktori saat ini ke HTML saat diedit

$ ls *.md | entr +/tmp/notify &
$ while read F
> do
>   markdown2html $F
> done < /tmp/notify
Eradman
sumber
Menarik, tapi aneh. Jadi ... ia membaca banyak nama file pada input standar, dan menjalankan perintah yang ditentukan ketika salah satu dari mereka berubah?
tripleee
Terlihat menarik, terima kasih! Apakah ada cara untuk entrmeneruskan nama file yang telah berubah juga?
Tobias Kienzler
Pada rilis 2.7, /_argumen khusus (agak analog dengan $_ dalam Perl) diganti dengan nama file pertama yang diubah
eradman