将系统命令的输出捕获到文本文件的最佳方法?
Posted
技术标签:
【中文标题】将系统命令的输出捕获到文本文件的最佳方法?【英文标题】:Best way to capture output from system command to a text file? 【发布时间】:2011-12-09 14:05:37 【问题描述】:我正在尝试使用 Perl 的 system
函数来捕获输出,以执行系统命令的输出并将其重定向到文件,但由于某种原因,我没有得到整个输出。
我正在使用以下方法:
system("example.exe >output.txt");
这段代码有什么问题,或者有其他方法可以做同样的事情吗?
【问题讨论】:
example.exe 是一个 win32 控制台应用程序 【参考方案1】:与MVS's answer 相同,但现代且安全。
use strict;
use warnings;
open (my $file, '>', 'output.txt') or die "Could not open file: $!";
my $output = `example.exe`;
die "$!" if $?;
print $file $output;
更简单
use strict;
use warnings;
use autodie;
open (my $file, '>', 'output.txt');
print $file `example.exe`;
如果您同时需要 STDOUT 和 STDERR
use strict;
use warnings;
use autodie;
use Capture::Tiny 'capture_merged';
open (my $file, '>', 'output.txt');
print $file capture_merged system('example.exe') ;
【讨论】:
我真的无法想象你为什么会这样做,甚至不是第一次。而你仍然错过了标准错误。 首先,这篇文章开始是对 MVS 答案中过时的做法的评论。其次,我没有做“所有这些”,只是检查了我应该做的事情。第三,如果它是“全部”,它只是表明autodie
有多好。第四,我怎么会错过STDERR
?第五,是的,您可以使用 shell 重定向来完成所有操作,但 Frank 已经这样做了,而且我不信任 Windows shell/我没有 Windows 计算机来测试任何东西,所以只能靠已解决的***来测试。
@tchrist,除了shell重定向,你会怎么做?
澄清一下,我的回答是一个代码 sn-p,就像问题中一样。我没有包括严格或警告,因为我认为他已经有了它们。不过,我对 or
与 ||
的错误。任何一个都可以在这里工作,但or
更适合错误检查,所以我将对其进行编辑。当时我正在使用 php 进行编码,并且有点交叉。至于其余的,TMTOWTDI。 :)
@MVS,不,它是词法文件句柄,3-arg 打开并检查我关心的反引号执行的状态。不关心or
,我总是为在场的任何新手输入strict
和warnings
【参考方案2】:
使用普通 > 重定向输出只会捕获 STDOUT。如果您还想捕获 STDERR,请使用 2>&1:
perl -e 'system("dir blablubblelel.txt >out.txt 2>&1");'
更多详情请见Perlmonks
【讨论】:
这不是答案。此方法使用询问器,但需要另一个。【参考方案3】:当你想要永久输出时,你可以这样做:
#redirect STDOUT before calling other functions
open STDOUT,'>','outputfile.txt' or die "can't open output";
system('ls;df -h;echo something'); #all will be redirected.
【讨论】:
【参考方案4】:您也可以尝试让 Perl 捕获输出:
open(FILE, ">output.txt") or die "Could not open file: $!";
print FILE `example.exe`;
close(FILE);
【讨论】:
这不会为“系统”函数调用的命令重定向输出。这种解决方法有很大的但是。当'example.exe'产生非常大的输出时,你很容易溢出可用内存。【参考方案5】:我觉得这种方式非常好:
use warnings;
use strict;
use Capture::Tiny::Extended 'capture';
my ($out, $err, $ret) = capture
system 'example.exe';
;
$ret = $ret >> 8;
print "OUT: $out\n";
print "ERR: $err\n";
print "RET: $ret\n";
感谢 DWGuru 对 Capture::Tiny::Extended 发表评论。 :-)
【讨论】:
Capture::Tiny::Extended 自 2011 年以来似乎已被废弃,其大部分功能已经在原始 Capture::Tiny 中(最后更新于 2018 年),所以最好使用这个。【参考方案6】:这行得通:
在 C 代码中,您可以使用以下行来捕获所需的输出:
system("example.exe > \"output.txt\"");
【讨论】:
此示例仅在 output.txt 周围添加引号。没有空格的文件名不需要引号。它的效果与问题的效果相同。以上是关于将系统命令的输出捕获到文本文件的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章
将文本文件 (.txt) 加载到 bigquery 表的最佳方法