【问题标题】:How do I prevent my Perl script from echoing what is typed into the terminal while it's running?如何防止我的 Perl 脚本在运行时回显终端输入的内容?
【发布时间】: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,这似乎对我没有帮助,但我想我会把它留在这里以备将来参考。
  • 查看CPAN 的终端处理模块。或者,更简单一点,查看perldoc 中与Term 相关的核心模块。

标签: perl


【解决方案1】:

看看Term::ReadKey

use strict;
use warnings;
use Term::ReadKey;

ReadMode ( 'noecho' );
my $password = <STDIN>;
ReadMode ( 'normal' );    #Back to your regularly scheduled program

很遗憾,它不是标准模块。而且,我在 Windows 上遇到了一些问题。

【讨论】:

  • 就像我在问题中提到的那样,我找到了这个模块,但我真的不想引入任何其他模块,所以我正在寻找另一种方法。
  • @Matt 使用POSIX 模块怎么样?至少从 5.8.8 开始,它就包含在 Perl 中。这应该允许您设置 iocntrl 并关闭回声。
  • 我让它使用 POSIX::Termios 设置 cbreak 模式,然后在最后转回煮熟。还可以使用 来读取所有内容,这样脚本结束时就不会打印出来。我在疯狂的谷歌搜索中丢失了我用来解决这个问题的链接,但它与此类似:perlmonks.org/…
猜你喜欢
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 2015-02-10
  • 2014-02-09
  • 1970-01-01
相关资源
最近更新 更多