名前付きパイプによるデータの提供

名前付きパイプによるデータの提供

排他的な方法で曲のファイル名を提供するいくつかのデータファイルがあります。このデータをm3uファイルに変換して、すべてのアプリケーションで使用できるようにしたいと思います。 m3uファイルを生成するためにcronjobのようなものを使用したくありません。なぜなら、望むほど動的ではないからです。

だから私はNamed Pipeを使うことにしました。私のシナリオは次のとおりです。

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

これは最終的に次の場所に保存する必要があるシェルスクリプトコードです~/.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。 m3uを使用すると、cat出力は1回ではなく複数回表示されます。曲ライブラリファイルは実際には空で、出力は次のようになります。

$ 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行数は異なりますが、常に2つ以上の行があります。アイデアは、catコンテンツを一度だけ表示することです。

同様に、スクリプト自体は、コマンドラインから単一の実行で実行されたときに機能します。問題は、パイプとパイプの書き方(または読み方)にあります。

私が理解していない部分は何であり、どのように解決できますか?

答え1

2つ:

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

関連情報