Я играл с 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 для передачи на вход? В чем причина проблемы?
Ответы:
stty -echo
изменяет настройки дескриптора входного файла. Если вы что-то передаете в команду stty, то дескриптор входного файла - это труба, а stty в трубе - неуместно (как говорится в сообщении об ошибке).Неясно, чего вы пытаетесь достичь. Если вы хотите отправить текст
test
в свой Perl-скрипт для чтения вmy $input = <STDIN>;
строке, просто избавьтесь от stty.Если вы также хотите прочитать текст как пользовательский ввод (т. Е. Введенный) и при этом предотвращать отображение текста (например, пароль), то проверьте, является ли стандартный ввод tty (терминал), прежде чем выполнять stty:
system( qw( stty -echo ) ) if -t 0;
Тем не менее, не выкладывайте на все виды вещей, это не то, для чего нужен perl (иначе вы могли бы также написать все это в оболочке). Вы можете изменить настройки STY в Perl, Google является вашим другом.
источник
system( qw( stty -echo < /dev/tty) );
Это возможный обходной путь, но сценарий должен восстановить эхо впоследствии. Использование ожидаемого может быть более подходящим.stty
подключается к терминалу на его стандартном входе. Вам необходимо запустить скрипт Perl со стандартным входом, подключенным к терминалу, с которым вы хотите работать. Если скрипт Perl сам вызывается из области, в которой стандартный ввод перенаправлен на что-то, кроме терминала, вы можете использовать/dev/tty
ссылку на управляющий терминал процесса:Если вы хотите иметь возможность передавать входные данные в сценарий, и вам не важно, что сценарий делает с настройками терминала, вы можете использовать функцию ожидаемо . Использование ожидаемого ввода пароля для команды, которая требует терминала, является распространенным явлением.
Если сценарий Perl обращается к терминалу только путем вызова
stty
команды, альтернативный подход заключается в предоставлении фиктивнойstty
команды.источник