나는 다음과 같이 사용자 입력을 취하는 펄 스크립트를 가지고 놀고 있었다.
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