【问题标题】:Perl script interacting with another program's STDINPerl 脚本与另一个程序的 STDIN 交互
【发布时间】:2016-06-13 01:18:45
【问题描述】:

我有一个 Perl 脚本,它使用反引号调用另一个程序,并检查某些字符串的输出。这运行良好。

我遇到的问题是当另一个程序在它正在做的事情上失败并等待用户输入时。它要求用户在退出程序之前按两次回车。

我如何告诉我的 Perl 脚本在这个程序上按两次回车键?

【问题讨论】:

标签: perl stdin


【解决方案1】:

started 命令从您的脚本接收相同的 STDIN 和 STDERR,只是 STDOUT 通过管道传输到您的脚本。

您可以在运行命令之前关闭您的 STDIN,这样就没有输入源了。从 STDIN 读取会报错,被调用的命令会退出:

close STDIN;
my @slines = `$command`;

这也会使控制台输入脚本的机会无效。

另一种方法是使用IPC::Open2,它允许您的脚本同时控制命令的 STDIN 和 STDOUT:

use IPC::Open2;
open2($chld_in, $chld_in, 'some cmd and args');
print $chld_in "\n\n";
close $chld_in;
@slines = <$chld_out>;
close $chld_out;

此脚本提供命令所需的两个\n 输入并读取命令输出。

【讨论】:

  • 我发现使用close STDIN 不允许我捕获正在运行的程序的完整输出。我假设您的代码中有错字 - 应该是 open2($chld_out, $chld_in, 'some cmd and args'); ?但是我仍然遇到同样的问题 - 我读到这可能是因为我在 Windows 上运行?
  • 我设法通过在 open2 行之后添加两行来完成这项工作:sleep(10); print $chld_in;- 我假设它在准备好接受 \n\n 和我在其他地方发现 print $chld_in 对 Windows 系统有帮助。感谢@Sebastian 为我指明了正确的方向
【解决方案2】:

你可以直接用管道输入:

echo "\n\n" | yourcommand

【讨论】:

  • 我当前的代码如下所示:my @slines = "$command;那么它会变成:我的@slines = echo "\n\n" | "$command; ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 2011-04-06
  • 1970-01-01
相关资源
最近更新 更多