फ़ाइल से स्टड ले लो, लेकिन अभी भी यह टर्मिनल में दिखाई देता है


9

मेरे पास एक प्रोग्राम है जो प्रोग्राम रन के रूप में मुझे इनपुट डेटा की आवश्यकता है। इसकी कल्पना कुछ इस तरह से करें:

$ ./program
Hi there. What's your name? Zambezi
What is your quest? To make a program which runs nicely
What is your favourite color? Red
...

अब, मेरे पास अपने प्रोग्राम को चलाने के लिए कई परीक्षण इनपुट हैं। उन सभी में कुछ ऐसा है:

Arthur, King of the Britons
To seek the Holy Grail
...

हालाँकि, मेरी कुछ परीक्षण स्क्रिप्ट विफल हो जाती हैं, और दुर्भाग्य से मेरे लिए यह समझना बहुत कठिन है कि वे कहाँ असफल हुए, क्योंकि मेरा टर्मिनल इस तरह है:

$ ./program < arthur.txt
Hi there. What's your name?What is your quest?What is your favourite color?...

क्या कोई तरीका है कि मैं अभी भी stdinएक फ़ाइल के माध्यम से इनपुट दे सकता हूं , लेकिन फिर भी टर्मिनल दिखाई देता है जैसे कि मैंने यह सब टाइप किया था?

अगर वह मायने रखता है तो लिनक्स मिंट 16 मेरा ओएस है।


मैं नहीं जानता कि यह कैसे करना है, लेकिन आप "" का उपयोग करने में सक्षम होना चाहिए (असंबद्ध) छोटे उपकरणों का उपयोग करना। कुछ सुराग के लिए stackoverflow.com/questions/8514735/… देखें ।
जो

जवाबों:


13

इनपुट पुनर्निर्देशन (./program <arthur.txt) का उपयोग करने के बजाय, जो आपके प्रोग्राम के लिए केवल बफरिंग इनपुट है, आपको सवाल का इंतजार करने और एक-एक करके जवाब भेजने के लिए "उम्मीद" के रूप में टूल का उपयोग करना चाहिए।

#!/usr/bin/expect
log_user 0
spawn ./program
log_user 1

expect {
  "*?"
}
send "Arthur, King of the Britons\r"

expect {
  "*?"
}
send "To seek the Holy Grail\r"

expect {
  "*?"
}
send "...\r"

बेहतर उदाहरण: http://www.pantz.org/software/expect/expect_examples_and_tips.html


एक बार जब आपको उपरोक्त कार्य मिल जाता है, तो आप इसे एक expectस्क्रिप्ट में विकसित कर सकते हैं जो जानता है कि आपके कार्यक्रम के मुद्दों को क्या संकेत देता है, और "आपका पसंदीदा रंग क्या है?" के जवाब में अपने कार्यक्रम को तीसरी इनपुट लाइन खिलाना जानता है। प्रश्न - और फिर expectस्क्रिप्ट ने arthur.txtउन इनपुट को प्राप्त करने के लिए फ़ाइल (या किसी अन्य निर्दिष्ट, उचित रूप से संरचित, फ़ाइल) को पढ़ा है, बजाय स्क्रिप्ट में हार्ड-कोड किए।
जी-मैन ने कहा कि मोनिका '

7

यह वास्तव में क्या teeउपयोग किया जाता है।

उदाहरण के लिए:

$  echo foo | tee >( grep bar ) 
foo
$

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

अधिक जानकारी के लिए मैनपेज टी (1) की जांच करें।


1
क्या संदेश सही क्रम में दिखाई देने की गारंटी है, हालांकि? यहां तक ​​कि बफरिंग को नजरअंदाज करते हुए, यह अनिवार्य रूप से समवर्ती रूप से चलने वाले दो कार्यक्रम हैं और एक ही स्क्रीन पर लिखने की कोशिश कर रहे हैं।
फेडेरिको पोलोनी

1
हालांकि कोई मेरे परिदृश्य में इसका उपयोग कैसे करता है? मैंने मैनपेज़ को पढ़ने की कोशिश की, लेकिन लगता है कि इस उपकरण के लिए मेरे usecase की तुलना में बहुत अधिक है, और मुझे यह नहीं मिल रहा था कि मैं इसका उपयोग कैसे करूँगा जब यह आता है program.exeऔर arthur.txt
ज़म्बेजी

@ ज़ाम्बज़ीcat arthur.txt | tee >( program.exe )
gronostaj

2
मेरे दिमाग में भी सबसे पहले टी ही आया था। लेकिन मैंने इसकी कोशिश की है और पुष्टि की है कि यह काम नहीं करता है। आउटपुट अलग से दिखाता है। मेरे प्रयोग में, arthur.txt की सामग्री पहले दिखाई देती है, उसके बाद program.exe से प्रश्न पूछे जाते हैं। आप इसे उम्मीद के "असहनीय" के साथ काम करने में सक्षम हो सकते हैं लेकिन मुझे कोई भाग्य नहीं था।
कुछ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.