Eu estava jogando com um script perl que recebe a entrada do usuário com o seguinte:
system( qw( stty -echo ) );
$? == 0 or die "Error unable to disable character printing.\n";
print "$prompt: ";
my $input = <STDIN>;
Eu pensei que seria capaz de canalizar uma resposta usando eco, no entanto, parece entrar em conflito com o comando stty -echo e produz o seguinte erro:
stty: standard input: Inappropriate ioctl for device
Sem alterar o script perl, o que poderia ser feito no bash para passar na entrada? O que causa o problema?
Respostas:
stty -echo
altera as configurações no descritor do arquivo de entrada. Se você estiver canalizando algo para o comando stty, o descritor do arquivo de entrada é o pipe, e stty em um pipe é, eh, inapropriado (como a mensagem de erro diz).Não está claro o que você está tentando alcançar. Se você deseja enviar o texto
test
para o seu script perl para ser lido namy $input = <STDIN>;
linha, basta se livrar das coisas stty.Se você também quiser ler o texto como entrada do usuário (digitado) e, ao fazê-lo, impedir que o texto seja ecoado (por exemplo, uma senha), teste se a entrada padrão é um tty (terminal) antes de executar o stty:
system( qw( stty -echo ) ) if -t 0;
Dito isto, não concorde com todos os tipos de coisas, não é para isso que serve o perl (caso contrário, você também pode escrever tudo no shell). Você pode alterar as configurações stty de dentro do perl, o google é seu amigo.
fonte
system( qw( stty -echo < /dev/tty) );
é uma solução possível, mas o script precisa restaurar o eco posteriormente. Usar expect pode ser um ajuste melhor.stty
conecta ao terminal em sua entrada padrão. Você precisa executar o script Perl com sua entrada padrão conectada ao terminal em que deseja atuar. Se o próprio script Perl for chamado de um escopo em que a entrada padrão é redirecionada para algo diferente do terminal, você pode usar/dev/tty
para se referir ao terminal de controle do processo:Se você deseja passar a entrada para o script e não se importa com o que o script faz com as configurações do terminal, você pode usar expect . O uso de expect para alimentar uma senha com um comando que requer um terminal é comum.
Se o script Perl acessar o terminal apenas chamando o
stty
comando, uma abordagem alternativa seria fornecer umstty
comando fictício .fonte