2012-03-20 40 views

回答

6
my $output = `ssh login.com git clone --bare [email protected]:/nfs/repo/ /nfs/repo//4124/ 2>&1`; 

2>&1的在端发送标准误差到同一位置作为标准输出,这是由反引号捕获。

+0

简单就是最好+1(除非他们真正需要被分开) – 2012-03-20 09:20:00

+0

感谢,也可以将其重定向到文件还 – Rajeev 2012-03-20 09:25:41

+0

@红眼:如果他们需要保持分开,那么你必须更加努力(或者,更可能的是,只要安装和使用适当的模块,其他人已经为你做了更难的工作)。但是,如果程序以零状态(成功)退出,并且如果程序以非零状态退出时所有标准错误(即使您处于非零状态),但所显示的脚本都希望将捕获的材料视为全部为标准输出即使在程序失败时也可以具有非错误输出,即使程序成功时也可以输出错误。这很好,很简单(除非你使用C shell)。 – 2012-03-20 09:25:44

2

我个人是核心模块IPC::Open3的粉丝,虽然2> & 1的答案会在同一个流中获得stderr和stdout(通常也足够好)。以下将使他们分开。 虽然低级别解决方案较少。

use IPC::Open3 
my $pid = open3(\*CHLD_IN, \*CHLD_OUT, \*CHLD_ERR, qw(ssh login.com git clone --bare [email protected]:/nfs/repo/ /nfs/repo//4124/)); 

waitpid($pid, 0); 
my $child_exit_status = $? >> 8; 
if (child_exit_status != 0) 
{ 
    my $stderr = do { local $/; <CHLD_ERR> }; 
    print "Failed command because: $stderr\n"; 
} 
my $stderr = do { local $/; <CHLD_OUT> }; 
print "command stdout: $stdout\n"; 
2
use IPC::Run; 
my $rcode = run [ "ssh", "login.com", "git", ... ], 
    undef, \my $stdout, \my $stderr; 

if ($rcode) { 
    print $stderr, "\n"; 
} 
相关问题