एक आभासी फ़ाइल बनाएं जो वास्तव में एक कमांड है


18

क्या कोई वर्चुअल फ़ाइल बनाने का कोई तरीका है, जैसे कि फ़ाइल से पढ़ना वास्तव stdoutमें एक कमांड से पढ़ता है ; फ़ाइल को लिखना stdinएक कमांड के लिए लगातार लिखना है ?

अब तक मैंने इसे inotifywaitएक फाइल पर रखा है, जो फाइल के संशोधित होने पर एक कमांड को कॉल करता है, यह फाइल से इनपुट लेता है और इसे वापस लिखता है।

मुझे यह पसंद नहीं है कि inotifywaitहालांकि इसे फिर से शुरू करना है (और मुझे यह सुनिश्चित करना होगा कि यह हमेशा चल रहा है)। मैं केवल इस फ़ाइल का उपयोग शायद सप्ताह में दो बार करता हूं।

जवाबों:


17

आप एक नामित पाइप की तलाश में हो सकते हैं ।

mkfifo f
{
  echo 'V cebqhpr bhgchg.'
  sleep 2
  echo 'Urer vf zber bhgchg.'
} >f
rot13 < f

पाइप पर लिखना सुनने का कार्यक्रम शुरू नहीं करता है। यदि आप किसी लूप में इनपुट प्रोसेस करना चाहते हैं, तो आपको एक सुनने का प्रोग्राम चालू रखना होगा।

while true; do rot13 <f >decoded-output-$(date +%s.%N); done

ध्यान दें कि पाइप में लिखे गए सभी डेटा को मर्ज किया जाता है, भले ही कई प्रक्रियाएं लिख रही हों। यदि कई प्रक्रियाएं पढ़ रही हैं, तो केवल एक ही डेटा प्राप्त करता है। तो एक पाइप समवर्ती स्थितियों के लिए उपयुक्त नहीं हो सकता है।

एक सॉकेट सॉकेट समवर्ती कनेक्शन को संभाल सकता है, लेकिन यह मूल शेल स्क्रिप्ट के लिए क्षमताओं से परे है।

पैमाने के सबसे जटिल छोर पर कस्टम फाइल सिस्टम हैं , जो आपको एक फाइल सिस्टम को डिजाइन करने और माउंट करने की सुविधा देता है open, जहां प्रत्येक write, आदि, एक प्रोग्राम में एक फ़ंक्शन को ट्रिगर करता है। न्यूनतम निवेश नॉनट्रियल कोडिंग की दसियों लाइनें हैं, उदाहरण के लिए पायथन में । यदि आप फ़ाइलों को पढ़ते समय केवल कमांड निष्पादित करना चाहते हैं, तो आप स्क्रिप्टफ्यूज़ या फ़्यूज़फ्ल्ट का उपयोग कर सकते हैं ।


3

नामित पाइपों के संबंध में जागरूक होने वाली कुछ बातें: एक पाइप नहीं कर सकता - एक फ़ाइल के विपरीत - कई पाठक हैं। एक बार इसकी सामग्री पढ़ने के बाद यह चला गया है। तो आपको लूप करने की आवश्यकता है, अर्थात आपको लेखक से पाइप में सामग्री को लगातार पुश करने की आवश्यकता होगी।

मैं अपने आप को इस सवाल का जवाब खोज रहा हूं और केवल एक चीज जो मैं करने में सक्षम हूं, वह है स्क्रिप्टफ्यूज जो फ्यूज पर आधारित है ।


1

आप जो वर्णन करते हैं वह अनिवार्य रूप से एक फीफो विशेष फ़ाइल है, देखें fifo(7)। वे द्वारा बनाए गए हैं mkfifo(1), और फिर एक प्रक्रिया उन्हें आर / डब्ल्यू के लिए लिनक्स के तहत खोल सकती है (सभी यूनिक्स सिस्टम हैंडल नहीं करते हैं)। दो स्वतंत्र प्रक्रियाएं तब संचार के लिए इसका उपयोग कर सकती हैं।


0

"एक वर्चुअल फ़ाइल बनाएं जो वास्तव में एक कमांड है" का सबसे आसान तरीका है FUSE फाइल सिस्टम का विस्तार करना। फ़्यूज़पी जैसे पुस्तकालयों के साथ करना बहुत आसान है।

यहाँ एक FUSE फाइल सिस्टम का एक उदाहरण है जो आपको HTTP / HTTPS / FTP फ़ाइलों को पढ़ने देता है जैसे कि वे आपके ही लिनक्स बॉक्स पर मौजूद थे। आप इसी तरह से कुछ बना सकते हैं जो पढ़ने पर उसी के लिए कोई कमांड चलाता है।

यदि आप स्रोत कोड को देखते हैं तो यह कोड की शायद ही 50 लाइनें (किसी भी बॉयलरप्लेट कोड को छोड़कर) है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.