我有一个程序从外部应用程序读取输出。外部应用程序提供一组输出。我的程序读取此外部应用程序while($line=<handle to external app>)
的输出并将其打印到STDOUT。但“print $line STDOUT
”仅打印一些行,并且当错误发生时,打印到STDOUT不起作用,但我的更多日志记录语句“push @arr,$line
”已存储来自外部应用程序的完整输出。从此我知道STDOUT在发生错误时无法正常工作。
例如: 如果外部应用输出如下:
Starting command
First command executed successfully
Error:123 :next command failed
Program terminated
此处STDOUT
仅打印:
Starting command
First command executed successfully
但是,如果我检查数组,它有完整的输出,包括错误细节。所以我猜测STDOUT
已被重定向或丢失。
所以我尝试在程序开头存储STDOUT
到$old_handle using
打开,然后尝试在使用select($old_handle)
的print语句之前恢复它(在发生错误时认为有些事情重定向STDOUT)
但我没有成功,我不知道这里有什么问题。请帮帮我。
答案 0 :(得分:1)
输出可能是缓冲的。尝试设置
$| = 1;
在您的计划开始时。这将导致输出立即显示,而不是稍后进行缓冲。
答案 1 :(得分:0)
猜测,可能是因为错误输出没有转到STDOUT。使用重定向
first_program |& perl_program
或
first_program 2>&1 | perl_program