एक संवादात्मक कार्यक्रम के तर्क को गैर-अंतःक्रियात्मक रूप से पारित करना


114

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

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


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

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

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

जवाबों:


46

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

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


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

154

कई तरीकों से

अपने इनपुट को पाइप करें

echo "yes
no
maybe" | your_program

एक फ़ाइल से पुनर्निर्देशित

your_program < answers.txt

यहाँ एक दस्तावेज़ का उपयोग करें (यह बहुत पठनीय हो सकता है)

your_program << ANSWERS
yes
no
maybe
ANSWERS

यहाँ एक स्ट्रिंग का उपयोग करें

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

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

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

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

2
एक्सपेक्ट जैसे प्रोग्राम क्या क्लाइंट को एक छद्म ट्टी के तहत चलाया जाता है जहां यह क्लाइंट को दिखता है जैसे कि टर्मिनल के साथ एक उपयोगकर्ता है और दूसरे छोर पर एक कीबोर्ड है। आप एक नियमित पाइप के साथ ऐसा नहीं कर सकते।
त्रिकाल

महत्वपूर्ण सूचना। यदि हम आपूर्ति की गई कमांड में स्थान जोड़ते हैं तो यह काम नहीं करता है।
71GA

13

आप डेटा को एक फ़ाइल में रख सकते हैं और इसे इस तरह से फिर से निर्देशित कर सकते हैं:

$ cat file.sh
#!/bin/bash

read x
read y
echo $x
echo $y

स्क्रिप्ट के लिए डेटा:

$ cat data.txt
2
3

स्क्रिप्ट निष्पादित करना:

$ file.sh < data.txt
2
3

7

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

yes | execute_command

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


1

आप अपनी स्क्रिप्ट में इनपुट को पाइप करने के लिए प्रिंटफ का भी उपयोग कर सकते हैं।

var=val
printf "yes\nno\nmaybe\n$var\n" | ./your_script.sh

0

एकांत राल्टेरेटिव हो सकता है

echo "something" | tee /path/to/file

टी कमांड स्क्रीन पर मिलने वाले इनपुट को प्रिंट करता है और उसी समय फाइल में सेव करता है।

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