Tập lệnh bash có thể được nối vào một tập tin không?


32

Tôi muốn một tập lệnh ngủ trừ khi một tập tin nào đó được sửa đổi / xóa (hoặc một tập tin được tạo trong một thư mục nhất định, hoặc ...). Điều này có thể đạt được một cách thanh lịch? Điều đơn giản nhất xuất hiện trong đầu tôi là một vòng lặp ngủ một lúc trước khi kiểm tra lại trạng thái, nhưng có lẽ có một cách thanh lịch hơn?

Câu trả lời:


34

Trên linux, bạn có thể sử dụng inotifytính năng của kernel . Các công cụ để viết kịch bản có thể được tìm thấy ở đó: inotify-tools .

Ví dụ sử dụng từ 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
Hầu hết các đơn vị có một tính năng tương tự. Thật không may, mỗi cái có giao diện riêng và nhiều cái không có API shell.
Gilles 'SO- ngừng trở nên xấu xa'


3

Thật vậy, có: entr (1) sẽ chạy các lệnh tùy ý khi tệp thay đổi và cũng cung cấp tùy chọn tự động tải lại để khởi động lại máy chủ ứng dụng.

chỉnh sửa: một số ví dụ

Xây dựng lại nếu tập tin nguồn thay đổi

$ find *.c | entr make

Khởi chạy và tự động tải lại máy chủ kiểm tra nếu tệp thay đổi

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

Việc cung cấp một bản tóm tắt +/path/to/fifocho phép kịch bản phức tạp hơn bằng cách hướng dẫn entrviết tên của từng tệp thay đổi thành một ống có tên. Phần sau đây sẽ chuyển đổi các tệp Markdown trong thư mục hiện tại thành HTML khi chúng được chỉnh sửa

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

Hấp dẫn, nhưng kỳ lạ. Vậy ... nó đọc một loạt các tên tệp trên đầu vào tiêu chuẩn và chạy lệnh được chỉ định khi một trong số chúng thay đổi?
tripleee

Có vẻ thú vị, cảm ơn! Có cách nào để entrchuyển tên của tập tin đã thay đổi không?
Tobias Kienzler

Kể từ phiên bản 2.7, /_đối số đặc biệt (hơi giống với $_ trong Perl) được thay thế bằng tên của tệp đầu tiên đã thay đổi
eradman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.