「読み取りエラー:0:リソースを一時的に使用できません」というメッセージで「読み取り」が失敗するのはなぜですか?

「読み取りエラー:0:リソースを一時的に使用できません」というメッセージで「読み取り」が失敗するのはなぜですか?

スクリプト

#!/bin/bash --

# record from microphone
rec --channels 1 /tmp/rec.sox trim 0.9 band 4k noiseprof /tmp/noiseprof &&


# convert to mp3
sox /tmp/rec.sox --compression 0.01 /tmp/rec.mp3 trim 0 -0.1 &&


# play recording to test for noise
play /tmp/rec.mp3 &&


printf "\nRemove noise? "
read reply


# If there's noise, remove it
if [[ $reply == "y" ]]; then
  sox /tmp/rec.sox --compression 0.01 /tmp/rec.mp3 trim 0 -0.1 noisered /tmp/noiseprof 0.1
  play /tmp/rec.mp3
fi

エラー:read error: 0: Resource temporarily unavailable

しかし、-e、フラグを使用して有効にすると、readスクリプトは機能します。readline

ベストアンサー1

SoXプログラム(sox、、、)のいずれかが非playブロックで動作を変更する場合が発生します。しばしば何かが電話をかけるrecstdinfcntl(0, F_SETFL, O_NONBLOCK)

電話するときread()非ブロックファイル記述子に対してシステムコールが行われ、コールは待機しません。カーネルバッファに読み込んで返す項目が既に存在するかread()失敗してerrno設定されますEAGAIN

BashがEAGAINコマンドを使用してstdinから読み込んでいる間にこのエラーが発生すると、発生したread「リソースを一時的に使用できません」というメッセージが表示されます。

<&-すべてのSoXコマンドの最後にこれを追加してみてください。これstdinによりコマンドがオフになり、動作方法を変更できなくなります。

おすすめ記事