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


9

我在玩一个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中完成传递输入的操作吗?是什么原因引起的问题?


而不是使用perl使用Expect
PersianGulf 2014年

perl示例可能未突出显示该问题。错误本质上是由以下顺序引起的:echo test | stty -echo;
user2219808

Answers:


5

stty -echo更改输入文件描述符上的设置。如果您要向stty命令传递内容,则输入文件描述符为管道,并且管道上的stty是不适当的(如错误消息所示)。

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

如果您还想读取文本作为用户输入(即输入),并且在执行此操作时防止回显文本(例如,密码),那么请在进行样式之前测试标准输入是否为tty(终端):

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

就是说,不要为各种事情掏腰包,那不是perl的目的(否则,您最好将整个事情写在shell中)。您可以在perl中更改样式设置,google是您的朋友。


这不是我的脚本,所以我正在寻找传递输入并使其自动化而不更改它的方法。预计可能是解决方案,我认为有可能是一个另一种方式来管的事情英寸
user2219808

system( qw( stty -echo < /dev/tty) );是一种可能的解决方法,但是脚本需要在以后还原回显。使用Expect可能更合适。
Henk Langeveld 2014年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.