脚本
#!/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
,如果我使用on 标志read
来启用,则脚本可以工作readline
发生的情况是,您的 SoX 程序之一 (
sox
、play
、rec
) 改变了stdin
行为方式,使其成为非阻塞的。通常,有东西在呼唤。fcntl
(0, F_SETFL, O_NONBLOCK)
read()
当对非阻塞文件描述符进行系统调用时,该调用不会等待:要么内核缓冲区中已有内容要读取并返回,要么失败并read()
设置errno
为EAGAIN
。当 Bash
EAGAIN
在使用命令从 stdin 读取时遇到此错误时read
,它会显示您遇到的“资源暂时不可用”消息。尝试
<&-
在每个 SoX 命令的末尾添加;这将对他们关闭stdin
,他们将无法改变其运作方式。