【发布时间】:2013-07-21 20:41:48
【问题描述】:
如何防止我的 Perl 脚本在运行时回显终端输入的内容?
我尝试弄乱system("stty -echo");,然后在最后运行system("stty echo");,但是一旦脚本结束,它仍然会显示我输入的内容。我一直在玩这个测试脚本。
#!/usr/bin/perl
use strict;
use warnings;
system("stty -echo");
for (1..15) {
print "$_\n";
sleep(1);
}
system("stty echo");
如果从未到达调用的第二个系统,这可能会弄乱终端(也许使用END 块,但这也不能保证工作)。这也只是 Unix,我的脚本也在 Windows 上运行。
我还找到了模块Term::Readkey,但我不想引入任何其他模块。
我也尝试关闭 STDIN,但这也没有用。
让这个问题变得更容易的是我在执行过程中根本不需要阅读STDIN,我可以忽略它。
我对这类问题没有太多经验,希望它比我想象的要容易。谢谢!
编辑:如果这有所作为,我正在使用 Perl 5.10。
【问题讨论】:
-
Re:“脚本结束后它仍然显示我输入的内容”:是不是因为您的 Perl 脚本从不读取该输入,所以脚本结束时它仍在缓冲区中,所以 shell读取它,从那时起您已经运行
stty echo,这会导致它被回显吗?似乎如果您希望此输入静音,则需要在运行stty echo之前阅读它。 (您可以使用scalar <>读取一行,或使用<>读取所有内容,直到下一个 EOF。) -
我假设您已经阅读了 Perl 常见问题解答中的“我如何要求用户输入密码”? perldoc.perl.org/…
-
@Nemo,是的!我已经。我不确定
ioctl()是如何工作的,或者这是否有助于解决我的问题。 @ruakh 如果我在最后一个只处理 1 行的系统调用之前执行<>;。如果我这样做while(<>){},它就会挂起。如果我这样做undef $/; <>;它也会挂起。 -
@Nemo 就密码而言,我还遇到了 IO::Prompt,这似乎对我没有帮助,但我想我会把它留在这里以备将来参考。
标签: perl