প্রতিধ্বনি পরীক্ষা | stty -echo -> stty: স্ট্যান্ডার্ড ইনপুট: ডিভাইসের জন্য অনুপযুক্ত ioctl


9

আমি একটি পার্ল স্ক্রিপ্ট নিয়ে খেলছিলাম যা নিম্নলিখিতগুলির সাথে ব্যবহারকারীদের ইনপুট নেয়:

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

আমি ভেবেছিলাম প্রতিধ্বনিতে প্রতিধ্বনিতে পাইপ করতে সক্ষম হবো তবে এটি stty -echo কমান্ডের সাথে বিরোধী বলে মনে হচ্ছে এবং নিম্নলিখিত ত্রুটিটি উত্পন্ন করেছে:

stty: standard input: Inappropriate ioctl for device

পার্ল স্ক্রিপ্ট পরিবর্তন না করে ইনপুটটিতে পাস করার জন্য ব্যাশে কী করা যেতে পারে? সমস্যার কারণ কী?


: যেমন: পরিবর্তে অনুবাদক আশা Perl ব্যবহারের thegeekstuff.com/2010/10/expect-examples
PersianGulf

পার্ল উদাহরণটি সম্ভবত সমস্যাটি তুলে ধরেছে না। ত্রুটিটি মূলত এই ক্রম থেকে উদ্ভূত হয়: প্রতিধ্বনি পরীক্ষা | stty -echo;
ব্যবহারকারী2219808

উত্তর:


5

stty -echoইনপুট ফাইল বর্ণনাকারীর সেটিংস পরিবর্তন করে। আপনি যদি স্টটি কমান্ডের জন্য কিছু পাইপ করছেন, তবে ইনপুট ফাইলের বর্ণনাকারীটি হ'ল পাইপ এবং পাইপের স্টিটি হ'ল, অনুপযুক্ত (ত্রুটির বার্তাটি বলেছে)।

আপনি কী অর্জন করতে চাইছেন তা অস্পষ্ট। আপনি যদি লাইনটি testপড়ার জন্য পাঠ্যটি আপনার পার্ল স্ক্রিপ্টে পাঠাতে চান my $input = <STDIN>;তবে কেবল স্টেটি স্টাফ থেকে মুক্তি পান।

আপনি যদি পাঠ্যটিকে ব্যবহারকারী ইনপুট হিসাবে পড়তে চান (যেমন টাইপ করেছেন) এবং এটি করার সময় পাঠ্যটি প্রতিধ্বনিত হওয়া (যেমন একটি পাসওয়ার্ড) আটকাতে চান তবে স্টাটি করার আগে স্ট্যান্ডার্ড ইনপুটটি tty (টার্মিনাল) কিনা তা পরীক্ষা করুন:

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

এটি বলেছিল, সমস্ত ধরণের জিনিস খোল না, পার্ল যা তা নয় (অন্যথায় আপনি পুরো জিনিসটি শেলের মধ্যেও লিখতে পারেন)। পার্লের মধ্যে থেকে আপনি স্টটি সেটিংস পরিবর্তন করতে পারেন, গুগল আপনার বন্ধু।


এটি আমার স্ক্রিপ্ট ছিল না তাই আমি কোনও পরিবর্তন না করে ইনপুট পাস করার ও স্বয়ংক্রিয় করার উপায় খুঁজছিলাম। । সম্ভবত সমাধান আশা, আমি মনে সেখানে নল জিনিষ করার জন্য একটি অন্য উপায় হতে পারে
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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.