2016-06-13 40 views
1

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

我遇到的问题是当其他程序在做什么时出现故障并等待用户输入。它要求用户在退出程序之前按两次输入。

如何告诉我的Perl脚本在此程序上按两次Enter?

+2

http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod – xxfelixxx

回答

3

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

您可以在运行命令之前关闭STDIN,并且不会有输入源。从标准输入读取会导致错误和被叫命令将退出:

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

这也将导致控制台输入的任何机会,你的脚本。

另一种方法是使用IPC::Open2,让你的脚本在同一时间,以控制标准输入和命令的标准输出:

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输入和读取命令的输出。

+0

我发现使用'close STDIN'不允许我捕获正在运行的程序的完整输出。我假设你的代码中有一个错字 - 它应该是'open2($ chld_out,$ chld_in,'一些cmd和args');'? 但是我仍然遇到同样的问题 - 我读过这是因为我在Windows上运行? –

+0

我设法通过在open2行之后添加两行来实现这个工作:'sleep(10);打印$ chld_in;' - 我假设它发送给孩子,然后准备好接受\ n \ n,并且我发现在其他地方打印$ chld_in可以帮助Windows系统。谢谢@Sebastian指引我朝着正确的方向前进 –

2

你可以只管他们:

echo "\n\n" | yourcommand 
+0

我当前的代码看起来是这样的:我 = @slines'“$ command'; 难道则成为: 我@slines = echo“\ n \ n”|'“$ command'; ? –