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?

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...

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'


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.