xzcmp 对某些文件不起作用。 (内部管道错误141?)

xzcmp 对某些文件不起作用。 (内部管道错误141?)

我用来xzcmp比较几个 XZ 文件。但我有一个奇怪的问题:对于某些文件(*),xzcmp 不起作用并返回退出代码 2,没有错误消息。

zxcmp version1.sql.xz version2.sql.xz 
echo $?    <-- 2

我无法解释为什么这些文件很特殊,因为这两个文件通常可以使用 xz 提取。

xz -dc version1.sql.xz > version1.sql
xz -dc version2.sql.xz > version2.sql
cmp version1.sql version2.sql
echo $?    <-- 1. works!

我调试了 /usr/bin/xzcmp 并发现执行了以下命令并返回退出状态 141

      elif # Reject Solaris 8's buggy /bin/bash 2.03.
          echo X | (echo X | eval "$cmp" /dev/fd/5 - >/dev/null 2>&1) 5<&0; then
        xz_status=$(
          exec 4>&1
          ($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- |
            ( ($xz2 -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- 5<&- </dev/null |
            eval "$cmp" /dev/fd/5 - >&3) 5<&0
        )

老实说,我不理解这段代码,也无法找出为什么它适用于大多数文件,而不适用于其他文件。

我使用的是 Debian 8。

不过我尝试过其他方法:

cmp <( xz -dc "version1.sql.xz" )  <( xz -dc "version2.sql.xz" )
echo $?    <-- 1. works!

这个解决方案也有效。但是这个简单的变体有一个大问题,即 xz 执行中的错误不会被注意到......

每一个提示都受到高度赞赏。

(*) 很抱歉,“某些文件不起作用”没有提供任何信息。所有文件都是 SQL 转储,并且全部使用 xz 进行压缩,压缩级别为 3。有效的文件和无效的文件之间几乎没有相似之处。

相关内容