क्या बैश स्क्रिप्ट को किसी फ़ाइल में डाला जा सकता है?


32

मैं चाहता हूं कि एक स्क्रिप्ट तब तक सो जाए जब तक कि एक निश्चित फ़ाइल को संशोधित / नष्ट नहीं किया जाता है (या एक निश्चित निर्देशिका में बनाई गई फ़ाइल, या ...)। क्या यह कुछ सुरुचिपूर्ण तरीके से प्राप्त किया जा सकता है? मेरे दिमाग में आने वाली सबसे सरल चीज एक लूप है जो स्थिति को फिर से जांचने से पहले कुछ समय के लिए सोता है, लेकिन शायद अधिक सुरुचिपूर्ण तरीका है?

जवाबों:


34

लिनक्स पर, आप कर्नेल की inotifyसुविधा का उपयोग कर सकते हैं । स्क्रिप्टिंग के लिए उपकरण वहां मिल सकते हैं: इनोटिफाई-टूल्स

उदाहरण विकी से उपयोग:

#!/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
अधिकांश यूनियनों में एक समान विशेषता है। दुर्भाग्य से प्रत्येक का अपना इंटरफ़ेस है, और कई का कोई शेल एपीआई नहीं है।
गिल्स एसओ- बुराई को रोकना '


3

वास्तव में वहाँ है: entr (1) फ़ाइलों को बदलने पर मनमानी कमांड चलाएगा, और एप्लिकेशन सर्वर को पुनरारंभ करने के लिए एक ऑटो-रीलोड विकल्प भी प्रदान करता है।

संपादित करें: कुछ उदाहरण

यदि स्रोत फ़ाइलें बदलते हैं, तो पुनर्निर्माण करें

$ find *.c | entr make

फ़ाइलों को बदलने के लिए लॉन्च और ऑटो-पुनः लोड परीक्षण सर्वर

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

एग्यूमेंट प्रदान करने से नामांकित पाइप में बदलने वाली प्रत्येक फ़ाइल का नाम लिखने का +/path/to/fifoनिर्देश देकर अधिक जटिल स्क्रिप्टिंग की अनुमति मिलती है entr। निम्नलिखित मार्कडाउन फाइलों को वर्तमान निर्देशिका में HTML में परिवर्तित कर देंगे, क्योंकि वे संपादित हैं

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

गूढ़, लेकिन अजीब। तो ... यह मानक इनपुट पर फ़ाइल नामों का एक गुच्छा पढ़ता है, और निर्दिष्ट कमांड चलाता है जब उनमें से एक बदलता है?
ट्रिपल

दिलचस्प लग रहा है, धन्यवाद! क्या entrफ़ाइल के नाम पर पास होने का कोई तरीका है जो बदल गया है?
टोबियास किन्ज़लर

2.7 रिलीज़ के अनुसार, विशेष /_तर्क ( $पर्ल में _ के अनुरूप ) को पहली फ़ाइल के नाम से बदल दिया गया है जो बदल गया है
eradman
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.