эхо-тест | stty -echo -> stty: стандартный ввод: неподходящий ioctl для устройства

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 для передачи на вход? В чем причина проблемы?

user2219808
источник
вместо perl используйте ожидаемый
PersianGulf,
Пример Perl может не освещать проблему. Ошибка по существу возникает из этой последовательности: эхо-тест | stty -echo;
user2219808

Ответы:

5

stty -echoизменяет настройки дескриптора входного файла. Если вы что-то передаете в команду stty, то дескриптор входного файла - это труба, а stty в трубе - неуместно (как говорится в сообщении об ошибке).

Неясно, чего вы пытаетесь достичь. Если вы хотите отправить текст testв свой Perl-скрипт для чтения в my $input = <STDIN>;строке, просто избавьтесь от stty.

Если вы также хотите прочитать текст как пользовательский ввод (т. Е. Введенный) и при этом предотвращать отображение текста (например, пароль), то проверьте, является ли стандартный ввод tty (терминал), прежде чем выполнять stty:

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

Тем не менее, не выкладывайте на все виды вещей, это не то, для чего нужен perl (иначе вы могли бы также написать все это в оболочке). Вы можете изменить настройки STY в Perl, Google является вашим другом.

wurtel
источник
Это был не мой сценарий, поэтому я искал способы передать ввод и автоматизировать его, не меняя его. Вероятно, это, вероятно, решение, я подумал, что, возможно, был еще один способ
передать
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
Жиль "ТАК - перестань быть злым"
источник