processamento do comando linha de saída por linha, sem misturar entrada padrão

5

Portanto, tenho um problema muito semelhante a Bash: Como ler uma linha de cada vez da saída de um comando? , eu estou fazendo:

while read path; do mplayer $path; done < <(find-me-random-mp3s)

ou

find-me-random-mp3s | while read path; do mplayer $path; done

O comando find-me-random-mp3s envia os caminhos de arquivos em uma nova linha. O problema começa quando mplayer é executado, ele começa a consumir linhas de find-me-random-mp3s output, ou seja, linhas que deveriam ser preenchidas dentro da variável path em cada iteração.

Eu continuei com essa solução:

find-me-random-mp3s | while read path; do cat /dev/null | mplayer $path; done

Mas eu realmente não gosto, bloqueia minha interação terminal com o mplayer também.

Existe algum método alternativo que eu possa usar nesse caso?

    
por aularon 03.01.2014 / 20:48

3 respostas

4
exec 3<&0
while read line
do
    mplayer "$line" <&3
done < <(find-me-random-mp3s)

Isto copia a entrada do terminal para o descritor de arquivo 3. No loop while, stdin está em todo lugar lido em seu programa find-me-random-mp3s exceto pela linha mplayer que obtém seu stdin do descritor de arquivo 3 que é seu terminal. Portanto, você ainda pode interagir com mplayer .

    
por 03.01.2014 / 21:07
5

Você pode usar um descritor de arquivo diferente:

exec 3< <(find-me-random-mp3s)
while IFS= read -r -u3 path; do mplayer "$path"; done
exec 3<&-
    
por 03.01.2014 / 21:08
2

Uma variação mais simples da solução do @ glenn-jackman que deve funcionar também, eu acho:

while read -u3 path; do mplayer "$path"; done 3< <(find-me-random-mp3s)
    
por 04.01.2014 / 09:04