Linux 用于捕获以反引号执行的命令的stderr和stdout的Perl脚本

Linux 用于捕获以反引号执行的命令的stderr和stdout的Perl脚本,linux,perl,Linux,Perl,在我在Perl脚本中执行的以下命令中,如何捕获stderr my $output = `ssh login.com git clone --bare user@login.com:/nfs/repo/ /nfs/repo//4124/`; if ($? ne '0') { $stderr = $output; print $stderr; } else { $stdout = $output; print $stdout; } 您可以使用捕获stdout、st

在我在Perl脚本中执行的以下命令中,如何捕获stderr

my $output = `ssh login.com git clone --bare user@login.com:/nfs/repo/ /nfs/repo//4124/`;
if ($? ne '0')
{ 
    $stderr = $output;
    print $stderr;
}
else
{
    $stdout = $output;
    print $stdout;
}
您可以使用捕获stdout、stderr或两者合并。

您可以使用捕获stdout、stderr或两者合并

my $output = `ssh login.com git clone --bare user@login.com:/nfs/repo/ /nfs/repo//4124/ 2>&1`;
末尾的
2>&1
将标准错误发送到与标准输出相同的位置,该位置由后引号捕获


最后的
2>&1
将标准错误发送到与标准输出相同的位置,标准输出被反引号捕获。

我个人是核心模块的粉丝,尽管2>&1的答案将使stderr和stdout在同一个流中(通常足够好)。以下内容将使它们保持分离。 不过,低层次的解决方案较少

use IPC::Open3
my $pid = open3(\*CHLD_IN, \*CHLD_OUT, \*CHLD_ERR, qw(ssh login.com git clone --bare user@login.com:/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";
使用IPC::Open3
my$pid=open3(\*CHLD\u IN,\*CHLD\u OUT,\*CHLD\u ERR,qw(ssh login.com git clone--bareuser@login.com:/nfs/repo//nfs/repo//4124/);
waitpid($pid,0);
我的$child\u exit\u status=$?>>8.
if(子项退出状态!=0)
{
my$stderr=do{local$/;};
打印“命令失败,因为:$stderr\n”;
}
my$stderr=do{local$/;};
打印“命令stdout:$stdout\n”;

我个人是核心模块的粉丝,尽管2>&1的答案将使stderr和stdout在同一个流中(通常已经足够好了)。以下内容将使它们保持分离。 不过,低层次的解决方案较少

use IPC::Open3
my $pid = open3(\*CHLD_IN, \*CHLD_OUT, \*CHLD_ERR, qw(ssh login.com git clone --bare user@login.com:/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";
使用IPC::Open3
my$pid=open3(\*CHLD\u IN,\*CHLD\u OUT,\*CHLD\u ERR,qw(ssh login.com git clone--bareuser@login.com:/nfs/repo//nfs/repo//4124/);
waitpid($pid,0);
我的$child\u exit\u status=$?>>8.
if(子项退出状态!=0)
{
my$stderr=do{local$/;};
打印“命令失败,因为:$stderr\n”;
}
my$stderr=do{local$/;};
打印“命令stdout:$stdout\n”;

这是一个常见问题:

这是一个常见问题:

简单是最好的+1(除非它们实际上需要分开保存)谢谢,还可以将其重定向到文件also@halkeye当前位置如果需要将它们分开,那么你必须更加努力地工作(或者,更可能的情况是,在其他人已经为您完成了更艰巨工作的地方安装并使用适当的模块)。但是,如果程序以零状态退出(成功),则显示的脚本希望将捕获的材料视为所有标准输出如果程序以非零状态退出,就好像这都是标准错误,即使程序失败时也可以有无错误输出,程序成功时也可以有错误输出@JonathanLeffler是的,我完全同意,这就是为什么我会给你+1的答案。太棒了!简短和甜蜜的简单是最好的+1(除非它们实际上需要分开保存)谢谢,还可以重定向到文件中吗also@halkeye当前位置如果需要将它们分开,那么你必须更加努力地工作(或者,更可能的情况是,在其他人已经为您完成了更艰巨工作的地方安装并使用适当的模块)。但是,如果程序以零状态退出(成功),则显示的脚本希望将捕获的材料视为所有标准输出如果程序以非零状态退出,就好像这都是标准错误,即使程序失败时也可以有无错误输出,程序成功时也可以有错误输出@JonathanLeffler是的,我完全同意,这就是为什么我要你的答案。太棒了!又短又甜