0

我正在将一个 perl 备份脚本从 CentOS 6 改编为 Ubuntu 20.04。

子例程 ExecCmd() 为 rsync 的系统调用启动一个子进程。

在 CentOS 6 上,它使用 rsync 输出填充变量 $ExecCmdOut 并返回退出状态 $pipestatus。

在 Ubuntu 上,$pipestatus 包含 rsync 输出的最后一行。在我看到的日志中

Error (573): rsync failed with status total size is 2,728,691,525  speedup is 509.15.

这是功能。你能看出为什么吗?

sub ExecCmd( \@$ ) {
    (my $cmdRef, my $forcelog) = @_;
    my @cmd = @$cmdRef;
    my $pipestatus='';
    die "Fork failed: $!\n" unless defined( my $pid=open(RCHILD, "-|"));
    if( $pid ) { 
        $ExecCmdOut='';
        while(<RCHILD>) {
            chomp( $_ );
            next if $_ eq '';
            s/\e\[[0-9\;]+[A-Za-z]//g; # remove ANSI escape sequences
            $ExecCmdOut.="$_\n";
            $pipestatus=$_;
        }
        close( RCHILD );
    } else {
        exec( "@cmd 2>&1; echo \${PIPESTATUS}" ) or die "exec failed: $!\n";
    }
    $ExecCmdOutout =~ s/$pipestatus\n$//;
    $pipestatus =  $? if not $pipestatus;
    return $pipestatus;
}
4

1 回答 1

0

您在此处使用当前行填充 $pipestatus:

$pipestatus=$_;

最后,您将其设置为 $? 仅当 $pipestatus 为假时。如果它包含最后一行,则不为假,因此不会更改为 $?。

于 2021-03-24T15:20:46.953 回答