修复 find 和 grep 管道的 Signal 13 (SIGPIPE) 错误

修复 find 和 grep 管道的 Signal 13 (SIGPIPE) 错误

我遇到了一种情况,我正在尝试将软件安装到我的系统中。

我使用 fakeroot 方法将它们安装在一个单独的目录中,在该目录中我列出了它们安装到三个文件中的所有文件、目录和链接FILESDIRSLINKS

然后我使用 find 获取名为 的文件中所有文件的 SHA1 哈希值sha1sums。我不需要文件sha1sums本身的哈希值。所以我使用了这个命令

 find . -type f -exec sha1sum {} \; | grep -ve "\./sha1sums$" >sha1sums

这很好用。然而,在安装时kbd-2.0.3,它抛出了很多行错误 -

 find: 'sha1sum' terminated by signal 13

我知道信号 13 是SIGPIPE信号(“管道破裂”)。但我不明白两件事:

  1. 为什么只有这个包会出现这种情况?
  2. 这可能是由于grep关闭读取管道引起的。但为什么要关闭它呢?

答案1

我实际上无法使用您使用的所有实用程序的 GNU 版本或我的本机 OpenBSD 实用程序重现您的问题。会不会是磁盘坏了?

但是,您可以完全省略计算该特定文件的 SHA1 摘要,而不是sha1sums通过管道过滤掉文件名:grep

find . -type f ! -path './sha1sums' -exec sha1sum {} + >sha1sums

否定测试将从传递给 的路径名列表中-path删除该路径名。./sha1sumssha1sum

+此外,由于最后的,该实用程序将一次性使用尽可能多的文件名调用,而不是每个名称调用一次。

由于这不使用管道,所以不会有SIGPIPE问题。

相关内容