回声测试| stty -echo -> stty:标准输入:设备的 ioctl 不合适

use*_*808 10 bash perl stty

我正在玩一个 perl 脚本,它接受用户输入以下内容:

system( qw( stty -echo ) );
$? == 0 or die "Error unable to disable character printing.\n";
print "$prompt: ";
my $input = <STDIN>;
Run Code Online (Sandbox Code Playgroud)

我以为我可以使用 echo 在响应中进行管道传输,但是它似乎与 stty -echo 命令冲突并产生以下错误:

stty: standard input: Inappropriate ioctl for device
Run Code Online (Sandbox Code Playgroud)

在不更改 perl 脚本的情况下,在 bash 中可以做什么来传递输入?导致问题的原因是什么?

wur*_*tel 5

stty -echo更改输入文件描述符的设置。如果您正在向 stty 命令传输某些内容,那么输入文件描述符就是管道,而管道上的 stty 是不合适的(就像错误消息所说的那样)。

目前尚不清楚您要实现的目标。如果您想将文本发送test到您的 perl 脚本以my $input = <STDIN>;在行中读取,那么只需摆脱 stty 的东西。

如果您还想将文本作为用户输入(即输入)读取,并且在这样做的同时防止文本被回显(例如密码),则在执行 stty 之前测试标准输入是否为 tty(终端):

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

也就是说,不要为各种各样的事情付出代价,这不是 perl 的用途(否则你最好在 shell 中编写整个事情)。您可以在 perl 中更改 stty 设置,谷歌是您的朋友。