将系统命令的输出捕获到文本文件的最佳方法?

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,我总是为在场的任何新手输入strictwarnings【参考方案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 表的最佳方法

将 niced 命令直接输出到文本文件

如何将窗口输出到文本文件?

在linux中给一个文本文件写内容的方法(三种)

请问linux把shell的信息全部输出到文本文件的命令是啥?

如何将dos命令的到的东西输出到文本文件中