Eu tenho alguns arquivos de dados que fornecem nomes de arquivos de músicas de maneira proprietária. Agora quero converter esses dados em arquivos m3u e disponibilizá-los para todos os aplicativos. Eu não quero usar algo como um cronjob que gere os arquivos m3u, pois isso não é tão dinâmico quanto eu quero que seja.
Portanto, decidi usar pipes nomeados. Meu cenário é assim:
-rw-rw-rw-+ 1 sjngm sjngm 33929 6. May 12:56 songstore-1.data
prw-r--r-- 1 sjngm sjngm 0 6. May 18:38 songstore-1.data.m3u
-rw-rw-rw- 1 sjngm sjngm 7750 6. May 12:56 songstore-2.data
prw-r--r-- 1 sjngm sjngm 0 6. May 18:38 songstore-2.data.m3u
:
O script para executar uma corrida para um arquivo parece funcionar bem:
#/bin/bash
file="$1"
echo "#EXTM3U"
paste -d '\n' \
<(tail -n +4 "$file" | grep "^#DESCRIPTION" | sed -e 's/#DESCRIPTION /#EXTINF:0,/') \
<(tail -n +4 "$file" | grep "^#SERVICE" | cut -d ':' -f 11 | sed -e 's/%3a/:/gi')
Este é o código do script de shell que, no final, deve ser armazenado em ~/.xprofile
:
cd ~/garage/songstores
ls -1 songstore-* |
paste - - |
while read in pipe; do
echo "$in..."
while true; do
~/shell-scripts/convert.sh "$in" > "$pipe"
done &
done
Depois de executar isso, os loops aparecem em ps
. Quando eu cat
one m3u a saída aparece muitas vezes mais do que apenas uma vez. Um arquivo de songstore está realmente vazio e a saída é:
$ cat songstore-13.data.m3u
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
$
Da próxima vez que eu executar o cat
, o número de linhas será diferente, mas sempre mais de um. A ideia é que o cat
resulte em apenas uma exibição do conteúdo.
Novamente, o próprio script funciona quando executado em uma única execução na linha de comando. O problema deve estar em conexão com os pipes e como eu escrevo (ou talvez leio) deles.
O que eu não entendi e como faço para corrigir isso?