प्रतिध्वनि को कैसे प्रतिध्वनित करें


2

मैं एक स्क्रिप्ट फ़ाइल से एक एप्लिकेशन को निष्पादित करता हूं और इसे इस तरह से यहां से डॉक रीडायरेक्ट करता हूं:

my_cli << HERE_DOC
enable
configure
10
exit
exit
HERE_DOC

यह उम्मीद के अनुसार काम करता है, लेकिन मुझे न तो इनपुट और न ही ऐप आउटपुट दिखाई देता है। एप्लिकेशन सी में लिखा गया एक इंटरेक्टिव प्रॉम्प्ट है। जब मैं इसके साथ मैनुअली इंटरैक्ट करता हूं, तो मैं प्रॉम्प्ट को खुद देखता हूं और अपने इनपुट पर प्रतिक्रिया देता हूं, लेकिन जब मैं उपरोक्त स्क्रिप्ट को निष्पादित करता हूं तो मुझे कुछ भी नहीं दिखता है। मैं चाहूंगा कि इनपुट और आउटपुट को प्रिंट किया जाए जैसे कि एक वास्तविक उपयोगकर्ता टाइप कर रहा था। क्या आप जानते हैं कि इसे कैसे प्राप्त किया जा सकता है?

जवाबों:


3

ऐसा लगता है कि वहाँ एक बेहतर तरीका होना चाहिए, लेकिन आप एक आवरण समारोह का उपयोग कर सकते हैं:

wrapper () { local text=$(</dev/stdin); echo "$text"; my_cli <<<"$text"; }
wrapper << HERE_DOC
enable
configure
10
exit
exit
HERE_DOC

यहाँ डॉक्टर लाइन को लाइन से संसाधित करने के लिए:

wrapper2 () { local line; while read -r line; do echo "$line"; my_cli <<<"$line"; done; }

यदि आप मैन्युअल रूप से अपने कार्यक्रम के साथ बातचीत करते हैं, तो क्या यह आउटपुट दिखाता है? यह stdout या stderr करने के लिए उत्पादन करता है?

एक अन्य विकल्प जो आपके लिए काम कर सकता है expect


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

@ फ़ायर एफ़िस: मेरा संपादन देखें। क्या आप मुझे बता सकते हैं कि आपका कार्यक्रम क्या है या यह क्या करता है? क्या यह एक स्क्रिप्ट है जिसे आप संशोधित कर सकते हैं?
डेनिस विलियमसन

मैंने सवाल अपडेट किया है।
फायरअफिस

@ फ़ायर एफ़िस: यह संभव है कि आपका प्रोग्राम सीधे tty के साथ बातचीत कर रहा हो या जब वह tty न हो तो अलग व्यवहार करता है। जैसा कि मैंने अपने उत्तर में उल्लेख किया है, आपको कोशिश करनी चाहिए expectजो इस उद्देश्य के लिए बनाई गई है और छद्म टेटी स्थापित करके काम करती है।
डेनिस विलियमसन

1

मैं पर्ल देखता हूँ!

यदि आप क्यूएक्स या सिस्टम कॉल का उपयोग कर रहे हैं, तो आप ऐसा नहीं कर सकते, क्योंकि वे प्रकृति में अवरुद्ध हैं (हाँ, आप सिस्टम ("प्रोग्राम और") कर सकते हैं या इसे दूसरे धागे से कॉल कर सकते हैं और इसे अलग कर सकते हैं।

लॉन्चर थ्रेड:

threads->create( sub { 
                    threads->self->detach(); 
                    qx"$cmd > file1.cmd";
});

मुख्य कोड:

threads->create( sub {
while (1) { 
 get file size, if it is bigger than second ago - read new line, increase size
 parse new line, if any?
 sleep 1;
}
} );

बेहतर, use POE::Wheel::FollowTail

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

man mkfifo

1
(tee /dev/fd/42 | mycmd) 42>&1 <<EOF
blah
blah
EOF

यह बिल्कुल वास्तविक उपयोगकर्ता की तरह नहीं दिखेगा - सभी इनपुट तुरंत प्रिंट हो जाएंगे। expectशायद इसके लिए बेहतर है।

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