2012-03-20 42 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"; 
} 
相關問題