"읽기 오류: 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, rec) 중 하나가 stdin비차단으로 동작을 변경하는 경우가 발생합니다. 종종 뭔가가 전화를 걸어fcntl(0, F_SETFL, O_NONBLOCK).

전화할 때read()비차단 파일 설명자에 대해 시스템 호출이 이루어지며 호출은 기다리지 않습니다. 커널 버퍼에 읽고 반환할 항목이 이미 있거나 read()실패하여 로 errno설정됩니다 EAGAIN.

Bash가 EAGAIN명령을 사용하여 stdin에서 읽는 동안 이 오류가 발생 하면 read발생한 "리소스를 일시적으로 사용할 수 없습니다"라는 메시지가 표시됩니다.

<&-모든 SoX 명령 끝에 이것을 추가해 보십시오 . 이렇게 stdin하면 명령이 꺼지고 작동 방식을 변경할 수 없습니다.

관련 정보