2009-09-28 18 views
5

के माध्यम से शेल स्क्रिप्ट से एकाधिक फ़ाइलों को सबमिट करना मेरे पास एक प्रोग्राम है जो कमांड लाइन से आवंटित मानक इनपुट से पढ़ता है। आम तौर पर उपयोगकर्ता कुछ जानकारी दर्ज करेगा, फाइल के अंत को सिग्नल करने के लिए एक नई लाइन पर सी-डी दबाएगा, और प्रोग्राम फ़ाइल को संसाधित करेगा। फिर उपयोगकर्ता को फिर से संकेत दिया जाएगा, कुछ और टेक्स्ट दर्ज करेंगे, और फिर दूसरी फ़ाइल के अंत को सिग्नल करने के लिए सी-डी दबाएं।मानक इनपुट

मैं एक शेल स्क्रिप्ट लिखना चाहता हूं जो इस कार्यक्रम को आमंत्रित करेगा और स्वचालित रूप से दो फाइलें सबमिट करेगा।

$ myprogram < file1.txt < file2.txt 

या

$ myprogam <file1.txt file2.txt 

कोई सुझाव: मैं कुछ इस तरह करना चाहते हैं? मैं लिनक्स के नीचे बैश खोल का उपयोग कर रहा हूँ।

+0

उपयोगकर्ता सभी फ़ाइलों का अंत कैसे इंगित करता है? दो नियंत्रण-डी एक पंक्ति में है? यूनिक्स प्रोग्राम के लिए मानक डिज़ाइन "कमांड लाइन पर नामित फ़ाइलें पढ़ें; यदि ऐसी कोई फाइल नहीं है, तो मानक इनपुट प्रक्रिया करें"। यदि आप उस डिजाइन को अपनाते हैं, तो कोई समस्या नहीं है; आप बस 'myprogram file1.txt file2.txt' का आह्वान करते हैं। –

उत्तर

3

जाहिर है आप एक कार्यक्रमों मानक इनपुट में दो फ़ाइलें भेजने के लिए cat उपयोग कर सकते हैं, लेकिन यह शायद नहीं है कि आप क्या चाहते:

$ cat file1.txt file2.txt | myprogram 

ऊपर मामले में myprogram जहां file1.txt समाप्त होता है बताने के लिए सक्षम नहीं होगा और file2.txt तब तक शुरू होता है जब तक कि उनके पास विशिष्ट प्रारूपण न हो और यह कुछ स्वरूपण के लिए स्ट्रीम देख रहा था जो फ़ाइल के अंत या शुरुआत को इंगित करता था।

मानक इनपुट में एकाधिक धाराओं को भेजने के लिए कोई मानक तरीका नहीं है। अनिवार्य रूप से मानक इनपुट में केवल एक ही स्ट्रीम आ रही है।

आप शायद अपनी स्क्रिप्ट को ढूढ़ेंगे ताकि यह कमांड लाइन पर कई तर्क स्वीकार कर सके और आंतरिक रूप से उन्हें एक बार खोला और संसाधित किया जा सके। अर्थात, आप यह बहुत की तरह कहेंगे:

$ myprogram file1.txt file2.txt 
+0

शायद कहने का एक तरीका है: $ cat file1.txt "EOF" file2.txt और फिर यह पता होगा कि यह दो अलग-अलग फाइलें हैं? –

+0

नहीं, इस तरह ईओएफ भेजने का कोई तरीका नहीं है; पावेल शेव के जवाब पर मेरी टिप्पणियां देखें। –

0

जोनाथन Leffler ने अपनी टिप्पणी में कहा गया है कि मेरी समाधान गलत है। एसा हो सकता हे। मैंने वास्तव में इसे अच्छी तरह से जांच नहीं की है। लेकिन यह सिर्फ जानकारी के लिए यहां रहने दें कि कम से कम एक गलत जवाब है।


बैश अपनी echo कमांड के साथ एक नियंत्रण चरित्र गूंज कर सकते हैं। EOFC-d है, जैसा कि आप पहले ही उल्लेख किया गया है, तो चलो एक subshell का उपयोग करते हैं:

$ (cat file1.txt ; echo -e '\cD' ; cat file2.txt) | myprogram 

यह कोष्ठकों और पाइप उन सब के उत्पादन के भीतर आदेश पर अमल होगा जैसे कि यह एक अलग कार्यक्रम थे।

आप अनिश्चित हैं कि यह पाइप सही ढंग से, इस कोशिश कर रहे हैं:

$ (echo "Hello" ; echo -e '\cD' ; echo "bash") | tee 
+1

नियंत्रण-डी को टर्मिनल ड्राइवर द्वारा अवरुद्ध किया जाता है और इसे लंबित डेटा भेजता है - यदि कोई लंबित नहीं है तो कोई वर्ण नहीं। इस कार्यक्रम को शून्य-बाइट पढ़ा जाता है, जो ईओएफ को इंगित करता है। पाइपलाइन के नीचे शाब्दिक नियंत्रण-डी वर्णों को प्रतिबिंबित करने से यह अनुकरण नहीं होता है - सहायता करने के लिए कोई टर्मिनल ड्राइवर नहीं है। यही वह जगह है जहां 'उम्मीद' आती है - यह टर्मिनल अनुकरण करने के लिए छद्म-टीटीआई का उपयोग करती है। –

2

यह 1 मंगलाचरण होने के लिए है? यदि नहीं:

for file in file1 file2 file3; do myprogram < $file; done 
0

मैंने आपके द्वारा वर्णित कार्यक्रम के व्यवहार को अनुकरण करने के लिए एक सरल पायथन कार्यक्रम लिखा है। कम से कम, यह आपको यह मानने के बजाय कि आपका प्रोग्राम कैसे काम करता है, वही चीज़ के बारे में बात करने की स्थिति में है। (बेशक, यदि आपका प्रोग्राम वास्तव में जिस तरीके से वर्णन कर रहा हूं, वह वास्तव में काम नहीं करता है, तो कृपया मुझे सही करें।)

#!/usr/bin/python 

def read_a_file(): 
    print('Type the contents of a file now.') 
    while True: 
     try: 
      s = raw_input('>') 
     except EOFError: 
      break 

read_a_file() 
read_a_file() 
print('We have now read two files. Quitting.') 

आप इस स्क्रिप्ट चला सकते हैं पहले फ़ाइल की सामग्री को टाइप करें, Ctrl-D मारा, दूसरी फ़ाइल की सामग्री को टाइप करें, Ctrl-D मारा, और कार्यक्रम से बाहर निकलता है। यह वह व्यवहार प्रतीत होता है जो आप वर्णन कर रहे हैं।

मेरा पहला विचार उम्मीदों का उपयोग करना था, अराजकता के अनुसार। हालांकि, मुझे किसी फ़ाइल की सामग्री को किसी प्रक्रिया में पाइप करने की अपेक्षा में कोई समर्थन नहीं मिल रहा है। (मुझे लगता है कि फाइलों की सामग्री हर बार अलग होती है। अगर वे वही हैं, तो अपेक्षा की जाती है कि उम्मीदों की अपेक्षा स्क्रिप्ट में फाइलों की सामग्री डालें।)

मुझे ध्यान रखना चाहिए कि मैं हूं किसी भी तरह से एक विशेषज्ञ विशेषज्ञ नहीं; ऐसा करने का एक तरीका हो सकता है जो मेरे लिए स्पष्ट नहीं है।

मेरा दूसरा विचार एक पायथन लिपि लिखना था जिसने आपका प्रोग्राम लॉन्च किया, और इसे फाइलों और ईओएफ पात्रों की सामग्री खिलाया। हालांकि, जोनाथन लेफ्लर की टिप्पणियों ने मुझे सोचा कि ईओएफ पात्रों को प्रतिबिंबित करना काम नहीं करेगा।

मेरा तीसरा विचार बहुत डरावना है। आप एक स्क्रिप्ट लिख सकते हैं जो फ़ाइलों की सामग्री को अपेक्षित स्क्रिप्ट में प्लग करके और उम्मीद स्क्रिप्ट को निष्पादित करके एक अपेक्षित स्क्रिप्ट बनाता है। मुझे संदेह है कि काम करेगा।

संबंधित मुद्दे