इको टेस्ट | stty -echo -> stty: standard input: डिवाइस के लिए अनुपयुक्त ioctl


9

मैं एक पर्ल स्क्रिप्ट के साथ खेल रहा था जो निम्नलिखित के साथ उपयोगकर्ता इनपुट लेता है:

system( qw( stty -echo ) );
$? == 0 or die "Error unable to disable character printing.\n";
print "$prompt: ";
my $input = <STDIN>;

मैंने सोचा था कि मैं प्रतिध्वनि का उपयोग करके प्रतिक्रिया में पाइप करने में सक्षम होऊंगा, लेकिन यह स्टेच्यू-कमांड के साथ संघर्ष करने के लिए लगता है और निम्नलिखित त्रुटि उत्पन्न करता है:

stty: standard input: Inappropriate ioctl for device

पर्ल स्क्रिप्ट को बदले बिना इनपुट में पास करने के लिए बैश में क्या किया जा सकता है? क्या समस्या का कारण बनता है?


: जैसे: बजाय दुभाषिया उम्मीद पर्ल उपयोग की thegeekstuff.com/2010/10/expect-examples
PersianGulf

पर्ल का उदाहरण समस्या को उजागर नहीं कर सकता है। इस क्रम से अनिवार्य रूप से त्रुटि उत्पन्न होती है: इको टेस्ट | स्टिच -चो;
user2219808

जवाबों:


5

stty -echoइनपुट फ़ाइल डिस्क्रिप्टर पर सेटिंग्स को बदलता है। यदि आप स्टेंट कमांड को कुछ पाइप कर रहे हैं, तो इनपुट फाइल डिस्क्रिप्टर पाइप है, और पाइप पर स्टिकी है, एह, अनुचित (जैसे त्रुटि संदेश कहते हैं)।

यह स्पष्ट नहीं है कि आप क्या हासिल करने की कोशिश कर रहे हैं। यदि आप पंक्ति testमें पढ़ने के लिए अपनी पर्ल स्क्रिप्ट को टेक्स्ट भेजना चाहते हैं my $input = <STDIN>;, तो बस स्टेंट सामान से छुटकारा पाएं।

यदि आप पाठ को उपयोगकर्ता इनपुट (यानी टाइप किया हुआ) के रूप में पढ़ना चाहते हैं और करते समय पाठ को प्रतिध्वनित होने से रोकते हैं (उदाहरण के लिए एक पासवर्ड) तो परीक्षण करें कि क्या स्टेंट करने से पहले मानक इनपुट एक tty (टर्मिनल) है:

system( qw( stty -echo ) ) if -t 0;

उस ने कहा, सभी प्रकार की चीजों के लिए खोल नहीं है, यह नहीं है कि क्या है के लिए पर्ल (अन्यथा आप के रूप में अच्छी तरह से खोल में पूरी बात लिख सकते हैं)। आप perl के भीतर से स्टाइट सेटिंग बदल सकते हैं, Google आपका मित्र है।


यह मेरी स्क्रिप्ट नहीं थी इसलिए मैं इनपुट को पारित करने और इसे बदलने के बिना इसे स्वचालित करने के तरीकों की तलाश कर रहा था। उम्मीद शायद समाधान है, मैंने सोचा कि चीजों को पाइप करने का एक और तरीका हो सकता है।
user2219808

system( qw( stty -echo < /dev/tty) );एक संभावित समाधान है, लेकिन स्क्रिप्ट को प्रतिध्वनि को पुनर्स्थापित करने की आवश्यकता है। उम्मीद का उपयोग करना बेहतर हो सकता है।
हेन्क लैंगवेल्ड

2

sttyअपने मानक इनपुट पर टर्मिनल से जुड़ता है। आपको पर्ल स्क्रिप्ट को उसके मानक इनपुट से जोड़ना होगा जो उस टर्मिनल से जुड़ा है जिस पर आप कार्य करना चाहते हैं। यदि पर्ल स्क्रिप्ट को स्वयं उस दायरे से आमंत्रित किया जाता है जहां मानक इनपुट को टर्मिनल के अलावा किसी अन्य चीज़ पर पुनर्निर्देशित किया जाता है, तो आप /dev/ttyप्रक्रिया के नियंत्रण टर्मिनल का उल्लेख करने के लिए उपयोग कर सकते हैं :

that_perl_script </dev/tty

यदि आप स्क्रिप्ट में इनपुट पास करना चाहते हैं, और आपको इस बात की परवाह नहीं है कि स्क्रिप्ट टर्मिनल सेटिंग्स के साथ क्या करती है, तो आप उम्मीद का उपयोग कर सकते हैं । किसी आदेश के लिए पासवर्ड फीड करने की अपेक्षा का उपयोग करना जिसके लिए टर्मिनल की आवश्यकता होती है

यदि पर्ल स्क्रिप्ट केवल sttyकमांड को कॉल करके टर्मिनल तक पहुंचती है, तो डमी sttyकमांड प्रदान करने के लिए एक वैकल्पिक दृष्टिकोण होगा ।

mkdir dummy-stty
echo '#!/bin/sh' >dummy-stty/stty
chmod a+rx dummy-stty/stty
echo swordfish | PATH=$PWD/dummy-stty:$PATH that_perl_script
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.