2009-12-09 14 views
5

मैं एक उम्मीद स्क्रिप्ट लिख रहा हूं और शेल प्रॉम्प्ट (लिनक्स पर) से निपटने में परेशानी हो रही है। मेरी अपेक्षा स्क्रिप्ट rlogin फैलती है और रिमोट सिस्टम ksh का उपयोग कर रहा है। रिमोट सिस्टम पर प्रॉम्प्ट में वर्तमान निर्देशिका " > " (स्पेस से अधिक जगह) है। एक स्क्रिप्ट का टुकड़ा हो सकता है:मैं एक अपेक्षित स्क्रिप्ट में इनपुट बफर कैसे फ्लश कर सकता हूं?

send "some command here\r" 
expect " > " 

यह सरल आदेशों के लिए काम करता है, लेकिन कोई बात बिगड़ जाए जब आदेश मैं भेज रहा हूं (या अधिक सटीक टर्मिनल की चौड़ाई से अधिक है शुरू करते हैं, क्या ksh सोचता है की चौड़ाई है अन्तिम छोर)। उस स्थिति में, ksh इंटरैक्टिव कमांड लाइन की कुछ अजीब क्षैतिज स्क्रॉलिंग करता है, जो प्रतीत को फिर से लिखने लगता है और आउटपुट में अतिरिक्त ">" चिपकाता है। स्वाभाविक रूप से यह उम्मीद स्क्रिप्ट को भ्रमित करने और सिंक से बाहर होने का कारण बनता है जब कमांड निष्पादित करने के बाद आउटपुट में एक से अधिक संकेत होते हैं (मेरी स्क्रिप्ट में कई send/expect जोड़े शामिल हैं)।

मैंने दूरस्थ सिस्टम पर PS1 को "प्रॉम्प्ट>" जैसी कुछ विशिष्ट चीज़ों में बदलने की कोशिश की है, लेकिन एक समान समस्या उत्पन्न होती है जो मुझे इंगित करती है कि इसे हल करने का सही तरीका नहीं है।

जो मैं सोच रहा हूं वह मदद कर सकता है स्क्रिप्ट के लिए यह बताने की क्षमता है कि "मुझे पता है कि मैं इस बिंदु पर रिमोट सिस्टम के साथ ठीक से सिंक्रनाइज़ हूं, इसलिए अब इनपुट बफर को फ्लश करें।" expect कथन में -notransfer ध्वज है जो पैटर्न बफर को छोड़कर इनपुट बफर को छोड़ देता है, इसलिए मुझे लगता है कि मुझे इसके विपरीत की आवश्यकता है।

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

उत्तर

7

आप उम्मीद अब तक देखा गया है दूर सब उत्पादन फेंक करना चाहते हैं, कोशिश

expect -re $ 

यह जो इनपुट बफर के अंत का मतलब है $ पर एक regexp मैच है, इसलिए यह सब कुछ इसलिए प्राप्त छोड़ देगा दूर। Expect man page पर अधिक जानकारी।

+0

बढ़िया, ऐसा लगता है कि मुझे बस इतना ही चाहिए। –

1

आप "सेट-मल्टीलाइन" या COLUMNS = 1000000 (या कुछ अन्य उपयुक्त बड़े मूल्य) को आजमा सकते हैं।

+0

इस प्रणाली पर 'ksh' में 'मल्टीलाइन' विकल्प प्रतीत नहीं होता है, लेकिन मुझे पता चला है कि अगर मैं + em emacs सेट करता हूं (emacs लाइन संपादन विकल्प को बंद करना, जो प्रतीत होता है यहां डिफ़ॉल्ट) तो क्षैतिज स्क्रॉलिंग भी अक्षम है। –

0

मुझे भूतकाल में उम्मीद थी और अतीत में उम्मीद थी। मेरा समाधान लॉग इन खोल के लिए ksh के अलावा कुछ और उपयोग करना था।

यदि आप ksh के अलावा दूरस्थ लॉगिन को बदल सकते हैं (chsh कमांड या संपादन/etc/passwd का उपयोग करके) तो आप इसे खोल के रूप में/bin/sh के साथ आज़मा सकते हैं।

एक और विकल्प केएसएच को बताना है कि टर्मिनल एक गूंगा टर्मिनल है - इसे किसी विशेष प्रसंस्करण करने से रोकें।

$ export TERM="" 

चाल चल सकता है।

+0

दुर्भाग्यवश, इस स्थिति में कई अन्य चीजें शेल होने पर शेल पर निर्भर करती हैं। मैं 'TERM' को अनसेट करने का प्रयास करूंगा, यह एक अच्छा विचार है। –

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