web-dev-qa-db-ja.com

読み取り停止時のパイプ破損エラー

2つのFLACファイルのオーディオコンテンツを一時ファイルにデコードせずに比較するための、すばやくダーティなbash関数を作成しようとしています。 flacコマンドラインツールを使用して、各ファイルを名前付きパイプにデコードし、それらをcmpと比較します。

function flacdiff {
        local pipe1="/tmp/$(randomString)"
        mkfifo "$pipe1" 
        flac --silent --decode --force-raw-format --sign=signed --endian=little "$1" --stdout > "$pipe1" &

        local pipe2="/tmp/$(randomString)"
        mkfifo "$pipe2"
        flac --silent --decode --force-raw-format --sign=signed --endian=little "$2" --stdout > "$pipe2" &

        cmp -b "$pipe1" "$pipe2"
        local result=$?

        rm "$pipe1"
        rm "$pipe2"

        return $result
}

ファイルが同一の場合、スクリプトは正しく機能します。ただし、それらが異なる場合、パイプの破損エラーが発生します。

[1]-  Broken pipe: 13         flac --silent --decode --force-raw-format --sign=signed --endian=little "$1" --stdout > "$pipe1"
[2]+  Broken pipe: 13         flac --silent --decode --force-raw-format --sign=signed --endian=little "$2" --stdout > "$pipe2"

これは、パイプの書き込み終了がまだアクティブであるときに、最初の不一致が発生するとすぐにcmpが読み取りを停止するためだと思います。私の質問は、この仮説が正しいかどうか、そしてこれらの壊れたパイプエラーを回避してスクリプトを修正することが可能かどうかです。

1
Tamás Zahola

使用する:

cmp -s \
    <(flac --silent --decode --force-raw-format --sign=signed --endian=little "$1" --stdout) \
    <(flac --silent --decode --force-raw-format --sign=signed --endian=little "$2" --stdout)
0
András Korn