2013-01-18 11 views
52

मेरे पास एक बैश स्क्रिप्ट है जो read कमांड को इंटरैक्टिव रूप से आदेशों को तर्क पढ़ने के लिए नियोजित करती है, उदाहरण के लिए हाँ/कोई विकल्प नहीं। क्या इस स्क्रिप्ट को गैर-इंटरैक्टिव स्क्रिप्ट में डिफ़ॉल्ट विकल्प मानों को तर्क के रूप में पास करने का कोई तरीका है?एक इंटरैक्टिव प्रोग्राम के लिए तर्क पारित करने के लिए गैर इंटरैक्टिव

यह केवल एक विकल्प नहीं है जिसे मुझे इंटरैक्टिव स्क्रिप्ट में पास करना है।

+2

यदि यह स्टडीन से पढ़ रहा है तो आप अपने इनपुट –

+2

में पाइप कर सकते हैं क्योंकि इस प्रश्न में कई डुप्लीकेट होते हैं, यह इंगित करने योग्य है कि इससे कोई फर्क नहीं पड़ता कि इंटरैक्टिव प्रोग्राम किस भाषा में लिखा गया है। यह एक सी प्रोग्राम हो सकता है जो मानक इनपुट, या एक एरलांग एप्लिकेशन, या जो कुछ भी पढ़ता है। ऐसा कुछ है जो कमांड लाइन से चलता है और अप्रिय रूप से इंटरैक्टिव इनपुट की मांग करता है, और आप इसे स्वचालित करना चाहते हैं। – tripleee

उत्तर

22

मोर के लिए उपयोग करें ई जटिल कार्य expect (http://en.wikipedia.org/wiki/Expect) है। यह मूल रूप से उपयोगकर्ता को अनुकरण करता है, आप एक स्क्रिप्ट को कोड कर सकते हैं कि विशिष्ट प्रोग्राम आउटपुट और संबंधित सामग्री पर प्रतिक्रिया कैसे करें।

यह ssh जैसे मामलों में भी काम करता है जो इसे पाइपिंग पासवर्ड प्रतिबंधित करता है।

+3

... हालांकि एसएसएच मामले में उचित समाधान सार्वजनिक कुंजी प्रमाणीकरण पर स्विच करना है। – tripleee

11

आप एक फ़ाइल में डेटा डाल सकते हैं और इसे इस तरह फिर से प्रत्यक्ष:

$ cat data.txt 
2 
3 

स्क्रिप्ट पर कार्य:

$ file.sh < data.txt 
2 
3 
88

स्क्रिप्ट के लिए

$ cat file.sh 
#!/bin/bash 

read x 
read y 
echo $x 
echo $y 

डाटा कई तरीके

पाइप वाई एक फ़ाइल से हमारे इनपुट

echo "yes 
no 
maybe" | your_program 

रीडायरेक्ट

your_program < answers.txt 

का प्रयोग कर एक here document (यह बहुत पठनीय हो सकता है)

your_program << ANSWERS 
yes 
no 
maybe 
ANSWERS 

एक here string

your_program <<< $'yes\nno\nmaybe\n' 
+2

यह भालू बताता है कि यह केवल तभी काम करता है जब प्रोग्राम मानक इनपुट पढ़ता है। कुछ कार्यक्रम पढ़ने के लिए उनके रास्ते से बाहर जाते हैं उदा। मानक इनपुट एक पाइप है, भले ही पासवर्ड इंटरैक्टिव रूप से। पासवर्ड के लिए, यह सुरक्षा कारणों से समझ में आता है; हालांकि कुछ इंटरैक्टिव प्रोग्राम बस खराब डिजाइन किए गए हैं। – tripleee

+0

@tripleee आपने जो कहा है उसकी रेखाओं के साथ, एक स्क्रिप्ट पासवर्ड कैसे पढ़ती है जो stdin से प्रभावित नहीं होती है? मुझे पता है कि आप stdin को पकड़ने के लिए 'read' का उपयोग कर सकते हैं, आप जो वर्णन करते हैं उसका उपयोग आप क्या कर सकते हैं? – flow2k

+0

उस स्थिति में, आपको यह देखने की ज़रूरत है कि आप जिस प्रोग्राम के साथ बातचीत करने का प्रयास कर रहे हैं, उसमें इनपुट भेजने के लिए एक विशेष तरीका है (उदा। एसएसपीपास, एसएसएच-एजेंट), या बातचीत को स्क्रिप्ट करने की अपेक्षा करें। –

3

बस एक और तरीका जोड़ना चाहते हैं। इसे कहीं और मिला, और यह काफी सरल है। कहें कि मैं "execute_command" कमांड के लिए कमांड लाइन पर सभी संकेतों के लिए हाँ पास करना चाहता हूं, तो मैं बस इसे हां पाइप करूंगा।

yes | execute_command 

यह हां का उपयोग सभी हां/नहीं संकेतों के उत्तर के रूप में करेगा।

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