다음과 같이 사용자 입력을 허용하는 Perl 스크립트를 사용하고 있습니다.
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
Perl 스크립트를 변경하지 않고 입력을 전달하기 위해 Bash에서 무엇을 할 수 있습니까? 문제의 원인은 무엇입니까?
답변1
stty -echo
입력 파일 설명자의 설정을 변경합니다. stty 명령에 무언가를 파이프하는 경우 입력 파일 설명자는 파이프이고 파이프의 stty는 부적절합니다(오류 메시지에서 말하는 것처럼).
무엇을 달성하고 싶은지 명확하지 않습니다. 텍스트를 test
Perl 스크립트로 보내 해당 행에서 읽으려면 my $input = <STDIN>;
stty 컨텐츠를 제거하십시오.
또한 텍스트를 사용자 입력(예: 입력)으로 읽고 텍스트가 에코(예: 비밀번호)되는 것을 방지하려면 stty를 실행하기 전에 stdin이 tty(터미널)인지 테스트하세요.
system( qw( stty -echo ) ) if -t 0;
즉, 모든 종류의 일에 비용을 지불하지 마십시오. 그것은 Perl의 목적이 아닙니다(그렇지 않으면 모든 것을 쉘에 작성하는 편이 나을 것입니다). Perl에서 stty 설정을 변경할 수 있습니다. Google이 여러분의 친구입니다.
답변2
stty
터미널의 표준 입력에 연결합니다. Perl 스크립트를 실행하고 해당 표준 입력을 작동하려는 터미널에 연결해야 합니다. Perl 스크립트 자체가 터미널이 아닌 범위로 리디렉션된 표준 입력에서 호출되는 경우 다음을 /dev/tty
사용하여 프로세스의 제어 터미널을 참조할 수 있습니다.
that_perl_script </dev/tty
스크립트에 입력을 전달하고 싶고 스크립트가 터미널 설정에 어떤 영향을 미치는지 신경 쓰지 않는다면 다음을 사용할 수 있습니다.예상되는. 기대치를 활용하라터미널이 필요한 명령에 비밀번호 제공흔한.
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