通过命名管道提供数据

通过命名管道提供数据

我有一些数据文件,它们以专有方式提供歌曲的文件名。现在我想将该数据转换为 m3u 文件并使其可供所有应用程序使用。我不想使用像 cronjob 这样的东西来生成 m3u 文件,因为它不像我想要的那样动态。

因此,我决定使用命名管道。我的场景如下所示:

-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
:

对一个文件执行一次运行的脚本似乎很好地完成了它的工作:

#/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')

这是最终应存储在的 shell 脚本代码~/.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

运行此命令后,循环将显示在 中ps。当我cat使用 m3u 时,输出会出现多次,而不仅仅是一次。一个歌曲库文件实际上是空的,输出是:

$ 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
$

下次执行时,cat行数会有所不同,但总是不止一行。这个想法是cat只显示一次内容。

同样,当在命令行上单次执行运行时,脚本本身可以工作。问题必须与管道以及我如何写入(或读取)它们有关。

我在那里不明白什么以及如何解决它?

答案1

两件事情:

1)我对外循环脚本应用了睡眠:

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)如果有人想要这样做:当已经尝试写入命名管道时,使用进程替换似乎不起作用。因此,使用临时文件的老式方法在这里有所帮助:

#/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

相关内容