2013-04-30 53 views
1

我想通过IPC :: Run从perl执行一个git命令,它从perl变量中获取git的STDOUT/STDERR-Output。从git捕捉STDOUT/STDERR

这里是我做的:

use strict; 
use warnings; 
use IPC::Run; 
my $stderr, $stdout, @cmd; 
push @cmd, "git"; 
push @cmd, "clone"; 
push @cmd, "http://my.gitserver.com/scm/tst2/abc.git"; 

my $success = IPC::Run::run \@cmd, '>', \$stdout, '2>', \$stderr; 
1; 

运行,这导致:

  • $标准输出:克隆到 'ABC' ...
  • $标准错误:空

从命令行直接运行git命令会导致以下输出:

$ git clone http://my.gitserver.com/scm/tst2/abc.git 
Cloning into 'abc'... 
remote: Counting objects: 3, done. 
remote: Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 

正如你所看到的,产生的git命令行上多一些输出比我其实我的Perl实现内拍摄。

怎么回事?

+2

输出你检查$ STDERR变量?另外,当我必须从perl管理GIT仓库时,我使用Git :: Repository模块。 – 2013-04-30 11:50:08

+1

额外的输出可能仅在STDOUT连接到终端时提供。如果是这样,提供一个伪TTY可能应该说服'git'输出它。请注意,它肯定会包含许多终端控制字符(回车符和退格符)。 – ikegami 2013-04-30 11:58:05

+0

@ miguel-prz:正如我所说的,在我的调用之后,$ stderr是空的......使用'Git :: Repository'模块在我的情况下不容易使用(因为我的“服务器”从命令执行的命令远程机器,并将结果写入共享沙箱 - 接收到的命令可以是“任何东西” - 不仅git命令... @ikegami:不知道如何做到这一点... – hoppfrosch 2013-04-30 13:05:07

回答

1

好消息是你的代码是正确的。令人困惑的部分是git根据标准错误是否连接到终端来更改其输出。

要从shell中重现Perl程序的输出,请从bash提示符处运行以下命令。

$ git clone http://my.gitserver.com/scm/tst2/abc.git |& cat 
Cloning into 'abc'...

|&重定向的GIT中的标准误差(其中预期进度输出变)和标准输出连接到一个管道而不是终端。

要查看通常的输出,您必须将git的标准错误连接到pseudo terminal,也称为ptyIPC::Run支持伪终端,在其文档的Pseudo Terminals section中描述。而不是重定向标准错误2>,而是使用2>pty>。请注意,这增加了对IO::Pty的依赖关系。

扭捏run重定向并在代码中添加调试输出如下

#! /usr/bin/env perl 

use strict; 
use warnings; 

use IPC::Run; 

my $cloneurl = 'http://my.gitserver.com/scm/tst2/abc.git'; 

my($stderr,$stdout); 
my @cmd = (qw/ git clone /, $cloneurl); 

my $success = IPC::Run::run \@cmd, '>', \$stdout, '2>pty>', \$stderr; 
print "success=[$success]\n"; 
print "stdout=[$stdout]\n"; 
print "stderr=[$stderr]\n"; 

产生类似于

success=[1] 
stdout=[] 
stderr=[Cloning into 'abc'... 
remote: Counting objects: 2818, done. 
remote: Compressing objects: 100% (1965/1965), done. 
remote: Total 2818 (delta 1200), reused 770 (delta 287) 
Receiving objects: 100% (2818/2818), 2.19 MiB | 1.19 MiB/s, done. 
Resolving deltas: 100% (1200/1200), done. 
Checking connectivity... done. 
]