ехо-тест | stty -echo -> stty: стандартний ввід: невідповідний йоктл для пристрою


9

Я грав зі сценарієм perl, який приймає дані користувача з наступним:

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

Я думав, що мені вдасться надіслати відповідь за допомогою echo, однак, здається, це суперечить команді stty -echo і видає таку помилку:

stty: standard input: Inappropriate ioctl for device

Не змінюючи сценарій perl, що можна зробити в bash, щоб пройти у вхід? Що викликає проблему?


замість PERL використання Чекайте перекладача: наприклад: thegeekstuff.com/2010/10/expect-examples
Перську затоку

Приклад perl, можливо, не висвітлює проблему. Помилка по суті виникає з такої послідовності: ехо-тест | stty -echo;
user2219808

Відповіді:


5

stty -echoзмінює налаштування дескриптора вхідного файлу. Якщо ви щось передаєте команді stty, то дескриптор вхідного файлу - це труба, а stty на трубі - це, наприклад, невідповідно (як каже повідомлення про помилку).

Незрозуміло, чого ви намагаєтесь досягти. Якщо ви хочете надіслати текст testдо свого сценарію perl, щоб прочитати його в my $input = <STDIN>;рядку, тоді просто позбудьтеся стильних речей.

Якщо ви також хочете читати текст як введення користувача (тобто вводиться), і при цьому це запобігає повторенню тексту (наприклад, пароль), тоді перед тим, як робити stty, перевіряйте, чи є стандартним вводом tty (термінал):

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

Однак, не розкажуйтеся на всілякі речі, це не те, для чого є perl (інакше ви також можете написати цілу справу в оболонці). Ви можете змінити налаштування stty зсередини perl, Google - ваш друг.


Це був не мій сценарій, тому я шукав способи передачі вводу та автоматизації його, не змінюючи його. Очікуйте, що це, мабуть, рішення, я думав, що може бути інший спосіб передачі речей.
user2219808

system( qw( stty -echo < /dev/tty) );це можливе вирішення, але сценарій повинен відновити відлуння згодом. Використання очікування може бути кращим.
Хенк Лангевельд

2

sttyпідключається до терміналу на своєму стандартному вході. Вам потрібно запустити скрипт Perl зі його стандартним входом, підключеним до терміналу, на якому потрібно діяти. Якщо сценарій Perl сам викликається з області, де стандартне введення переспрямоване на щось інше, ніж термінал, ви можете використовувати /dev/ttyдля позначення керуючого терміналу процесу:

that_perl_script </dev/tty

Якщо ви хочете передати вхід до сценарію, і вам не байдуже, що робить сценарій із налаштуваннями терміналу, ви можете використовувати очікувати . Використання очікування для подачі пароля до команди, для якої потрібен термінал, є загальним явищем.

Якщо скрипт Perl має доступ до терміналу лише за допомогою виклику 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.