为什么 `read` 失败并显示“读取错误:0:资源暂时不可用”?

为什么 `read` 失败并显示“读取错误: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,如果我使用标志 onread来启用,则脚本可以工作readline

答案1

发生的情况是,您的 SoX 程序之一 ( soxplayrec) 改变了stdin行为方式,使其成为非阻塞的。通常,有东西在呼唤fcntl(0, F_SETFL, O_NONBLOCK)

当呼叫read()系统调用是在非阻塞文件描述符上进行的,调用不会等待:要么内核缓冲区中已经有东西要读取并返回,要么read()失败并errno设置为EAGAIN

当 BashEAGAIN在使用命令从 stdin 读取时遇到此错误时read,它会显示您遇到的“资源暂时不可用”消息。

尝试<&-在每个 SoX 命令的末尾添加;这stdin将对他们关闭,他们将无法改变其运作方式。

相关内容