web-dev-qa-db-ja.com

findおよびgrepパイプラインのSignal13(SIGPIPE)エラーを修正

システムにソフトウェアをインストールしようとしている状況があります。

私は偽のルートアプローチを使用してそれらを別のディレクトリにインストールし、インストールするすべてのファイル、ディレクトリ、およびリンクを3つのファイルFILESDIRSLINKSにリストしています。

次に、findを使用して、sha1sumsという名前のファイル内のすべてのファイルのSHA1ハッシュを取得しています。ファイルsha1sums自体のハッシュは必要ありません。だから私はこのコマンドを使用しました

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

これはうまくいきました。ただし、kbd-2.0.3をインストールすると、多くのエラー行がスローされました-

 find: 'sha1sum' terminated by signal 13

シグナル13がSIGPIPEシグナル(「壊れたパイプ」)であることを私は知っています。しかし、私には2つのことがありません。

  1. なぜこのパッケージだけで起こっているのですか?
  2. これはおそらく、読み取りパイプをgrepが閉じていることが原因です。しかし、なぜそれを閉じるのですか?

使用しているすべてのユーティリティのGNUバージョン、またはネイティブのOpenBSDユーティリティでは、問題を実際に再現することはできません。ディスクが不良である可能性がありますか?

ただし、grepをパイプ処理してsha1sumsファイル名を除外するのではなく、その特定のファイルのSHA1ダイジェストの計算を完全に省略できます。

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

否定された-pathテストは、./sha1sumsに渡されたパス名のリストからsha1sumパス名を削除します。

さらに、ユーティリティは、最後に+があるため、名前ごとに1回ではなく、一度にできるだけ多くのファイル名で呼び出されます。

これはパイプラインを使用していないため、SIGPIPEの問題は発生しません。

1
Kusalananda