สคริปต์ bash สามารถเชื่อมโยงกับไฟล์ได้หรือไม่?


32

ฉันต้องการให้สคริปต์เข้าสู่โหมดสลียกเว้นว่ามีการแก้ไข / ลบไฟล์บางไฟล์ (หรือไฟล์ที่สร้างในไดเรกทอรีหรือ ... ) สามารถทำได้ในลักษณะที่สง่างาม? สิ่งที่ง่ายที่สุดที่อยู่ในใจของฉันคือการวนรอบที่หลับสักพักก่อนที่จะตรวจสอบสถานะอีกครั้ง แต่อาจมีวิธีที่สง่างามกว่านี้ไหม

คำตอบ:


34

บน linux คุณสามารถใช้inotifyคุณสมบัติของเคอร์เนลได้ เครื่องมือสำหรับการเขียนสคริปต์สามารถพบได้มี: inotify เครื่องมือ

ตัวอย่างการใช้งานจาก 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
Unices ส่วนใหญ่มีคุณสมบัติคล้ายกัน น่าเสียดายที่แต่ละตัวมีอินเตอร์เฟสของตัวเองและหลายตัวไม่มี shell API
Gilles 'หยุดชั่วร้าย'


3

อันที่จริงแล้วก็คือ: entr (1)จะเรียกใช้คำสั่งโดยพลการเมื่อมีการเปลี่ยนแปลงไฟล์และยังมีตัวเลือกการรีโหลดอัตโนมัติสำหรับการรีสตาร์ทแอพพลิเคชันเซิร์ฟเวอร์

แก้ไข: ตัวอย่างบางส่วน

สร้างใหม่หากไฟล์ต้นฉบับเปลี่ยนไป

$ find *.c | entr make

เรียกใช้และทดสอบเซิร์ฟเวอร์โหลดซ้ำอัตโนมัติหากไฟล์เปลี่ยน

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

การให้ agument +/path/to/fifoอนุญาตให้ใช้สคริปต์ที่ซับซ้อนมากขึ้นโดยสั่งentrให้เขียนชื่อของแต่ละไฟล์ที่เปลี่ยนเป็นไพพ์ที่มีชื่อ ต่อไปนี้จะแปลงไฟล์ Markdown ในไดเรกทอรีปัจจุบันเป็น HTML ตามที่แก้ไข

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

ที่น่าสนใจ แต่แปลก ดังนั้น ... มันจะอ่านชื่อไฟล์หลาย ๆ ไฟล์ในอินพุตมาตรฐานและรันคำสั่งที่ระบุเมื่อหนึ่งในนั้นเปลี่ยนไปหรือไม่
tripleee

ดูน่าสนใจขอบคุณ! มีวิธีการentrส่งผ่านชื่อของไฟล์ที่มีการเปลี่ยนแปลงเช่นกัน?
Tobias Kienzler

ตั้งแต่วันที่รีลีส 2.7 /_ข้อโต้แย้งพิเศษ(ค่อนข้างคล้ายกับ$_ ใน Perl) จะถูกแทนที่ด้วยชื่อของไฟล์แรกที่เปลี่ยน
eradman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.