スクリプト
#!/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
ブロックで動作を変更する場合が発生します。しばしば何かが電話をかけるrec
stdin
fcntl
(0, F_SETFL, O_NONBLOCK)
。
電話するときread()
非ブロックファイル記述子に対してシステムコールが行われ、コールは待機しません。カーネルバッファに読み込んで返す項目が既に存在するかread()
失敗してerrno
設定されますEAGAIN
。
BashがEAGAIN
コマンドを使用してstdinから読み込んでいる間にこのエラーが発生すると、発生したread
「リソースを一時的に使用できません」というメッセージが表示されます。
<&-
すべてのSoXコマンドの最後にこれを追加してみてください。これstdin
によりコマンドがオフになり、動作方法を変更できなくなります。