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

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

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에서 입력을 전달하기 위해 무엇을 할 수 있습니까? 무엇이 문제의 원인입니까?



답변

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

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

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

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

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


답변

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


답변