명명된 파이프를 통해 데이터 제공

명명된 파이프를 통해 데이터 제공

독점적인 방식으로 노래의 파일 이름을 제공하는 일부 데이터 파일이 있습니다. 이제 이 데이터를 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출력이 한 번이 아닌 여러 번 나타납니다. 노래 라이브러리 파일은 실제로 비어 있으며 출력은 다음과 같습니다.

$ 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

관련 정보