roteiro
#!/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
Erros com :read error: 0: Resource temporarily unavailable
Mas o script funciona se eu usar o -e
sinalizador ativado read
para ativarreadline
O que acontece é que um dos seus programas SoX (
sox
,play
,rec
) mudoustdin
seu comportamento, tornando-o não bloqueador. Normalmente, algo está chamando .fcntl
(0, F_SETFL, O_NONBLOCK)
Quando uma chamada para a
read()
chamada do sistema é feita em um descritor de arquivo sem bloqueio, a chamada não espera: ou já existe algo para ler no buffer do kernel e ele é retornado, ouread()
falha eerrno
é definido comoEAGAIN
.Quando o Bash encontra esse
EAGAIN
erro ao ler stdin com oread
comando, ele exibe a mensagem “Recurso temporariamente indisponível” que você encontrou.Tente adicionar
<&-
no final de cada um dos seus comandos SoX; isso será fechadostdin
para eles e eles não poderão alterar o funcionamento.