echo test | stty -echo - stty: entrada padrão: ioctl inapropriado para o dispositivo

9

Eu estava jogando com um script perl que leva 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 em 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?

    
por user2219808 27.09.2014 / 02:52

2 respostas

4

stty -echo altera as configurações no descritor do arquivo de entrada. Se você está canalizando algo para o comando stty, então o descritor do arquivo de entrada é o pipe, e stty em um pipe é, eh, inadequado (como a mensagem de erro diz).

Não está claro o que você está tentando alcançar. Se você quiser enviar o texto test para o seu script perl para ser lido na linha my $input = <STDIN>; , simplesmente se livre do material stty.

Se você também quiser ler o texto como entrada do usuário (ou seja, digitado) e, ao mesmo tempo, impedir que o texto seja ecoado (por exemplo, uma senha), teste se a entrada padrão é tty (terminal) antes de fazer o stty:

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

Dito isso, não descarte por todos os tipos de coisas, não é para isso que o perl serve (caso contrário, você pode escrever a coisa toda em shell). Você pode alterar as configurações stty de dentro do perl, o google é seu amigo.

    
por 27.09.2014 / 11:38
2

stty conecta-se 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 invocado a partir de um escopo no qual a entrada padrão é redirecionada para algo diferente do terminal, você pode usar /dev/tty para se referir ao terminal de controle do processo:

that_perl_script </dev/tty

Se você quiser passar a entrada para o script, e não se importar com o que o script faz com as configurações do terminal, você pode usar espera . Usando esperar para alimentar uma senha para um comando que requer um terminal é comum.

Se o script Perl acessar somente o terminal chamando o comando stty , uma abordagem alternativa seria fornecer um comando stty fictício.

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
    
por 28.09.2014 / 02:25

Tags