Fornecer dados através de pipe nomeado

1

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?

    
por sjngm 06.05.2017 / 19:56

1 resposta

0

Duas coisas:

1) Apliquei um sleep ao script de loop externo:

for f in /home/sjngm/garage/songstores-*.data; do
  echo "$f..."
  while true; do
    /home/sjngm/shell-scripts/convert.sh "$f" > "$f.m3u"
    sleep 2
  done &
done

2) Caso alguém queira fazer isso: não parece funcionar usar a substituição de processo quando já estiver tentando gravar em um pipe nomeado. Assim, a maneira antiga de usar arquivos temporários ajuda aqui:

#/bin/bash

file="$1"
tmpFile1="/tmp/'uuidgen'"
tmpFile2="/tmp/'uuidgen'"

tail -n +4 "$file" | grep "^#DESCRIPTION" | sed -e 's/#DESCRIPTION /#EXTINF:0,/' > $tmpFile1
tail -n +4 "$file" | grep "^#SERVICE" | cut -d ':' -f 11 | sed -e 's/%3a/:/gi' > $tmpFile2

echo "#EXTM3U"
paste -d '\n' $tmpFile1 $tmpFile2

rm $tmpFile1 $tmpFile2
    
por 11.05.2017 / 18:52

Tags