2013-04-30 56 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. 
]