에코 테스트 | stty -echo-> stty : 표준 입력 : 장치에 부적절한 ioctl


9

나는 다음과 같이 사용자 입력을 취하는 펄 스크립트를 가지고 놀고 있었다.

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

펄 스크립트를 바꾸지 않고 bash에서 입력을 전달하기 위해 무엇을 할 수 있습니까? 무엇이 문제의 원인입니까?


펄 대신 사용 인터프리터 : 예 : thegeekstuff.com/2010/10/expect-examples
PersianGulf

펄 예제는 문제를 강조하지 않을 수 있습니다. 오류는 본질적으로이 순서에서 발생합니다. echo test | stty -echo;
user2219808

답변:


5

stty -echo입력 파일 디스크립터의 설정을 변경합니다. stty 명령으로 무언가를 파이프하는 경우 입력 파일 디스크립터는 파이프이고 파이프의 stty는 부적절합니다 (오류 메시지와 같이).

무엇을 이루려고하는지 분명하지 않습니다. 텍스트 test를 perl 스크립트 에 보내서 my $input = <STDIN>;줄을 읽으 려면 stty를 제거하십시오.

텍스트를 사용자 입력 (예 : 입력)으로 읽고 텍스트를 반향하지 못하게하는 경우 (예 : 비밀번호) stty를 수행하기 전에 표준 입력이 tty (터미널)인지 테스트하십시오.

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

즉, 모든 종류의 것들에 대해 껍질을 벗기지 마십시오. 펄이 아닙니다 (그렇지 않으면 껍질에 모든 것을 쓸 수도 있습니다). 펄 내에서 stty 설정을 변경할 수 있습니다. Google은 친구입니다.


그것은 내 스크립트가 아니기 때문에 입력을 전달하고 변경하지 않고 자동화하는 방법을 찾고있었습니다. 아마도 해결책 일 것입니다. 다른 방법으로 파이프를
넣을

system( qw( stty -echo < /dev/tty) );가능한 해결 방법이지만 스크립트는 나중에 에코를 복원해야합니다. expect를 사용하는 것이 더 적합 할 수 있습니다.
Henk Langeveld

2

stty표준 입력 단자에 연결합니다. 표준 입력이 작동하려는 터미널에 연결된 상태에서 Perl 스크립트를 실행해야합니다. 표준 입력이 터미널 이외의 것으로 리디렉션되는 범위에서 Perl 스크립트 자체가 호출 /dev/tty되면 프로세스의 제어 터미널을 참조하는 데 사용할 수 있습니다 .

that_perl_script </dev/tty

스크립트에 입력을 전달하고 터미널 설정에서 스크립트가 수행하는 작업에 신경 쓰지 않으려면 expect 를 사용할 있습니다. 터미널을 요구하는 명령에 암호를 제공하기 위해 expect를 사용 하는 것이 일반적입니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.