스크립트
#!/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
하면 명령이 꺼지고 작동 방식을 변경할 수 없습니다.