Как прыгнуть в бесконечность при l oop, когда все данные считываются из канала? - PullRequest
1 голос
/ 04 мая 2020
cat  pipe.sh
#!/bin/bash
fifo_file=fifo.pipe
mkfifo $fifo_file
exec 6<>$fifo_file
rm $fifo_file

DateWrite ()
{
    i=0
    while [ $i -lt 100 ]
    do
        str=`date`
        i=$(( i+1 ))
        echo "$i $str"
    done
}

for  (( i=0; i<10; i++ ))
do 
     ( DateWrite >&6 ) &
done
while read date_time
do
    echo $date_time >> output.file
done <&6

Приведенный выше код bash создает именованный канал, функция DateWrite записывает строку в канал, создает процесс 10 для l oop, считывает данные из канала, в то время как l oop.
bash pipe.sh не может остановиться, оно входит в бесконечность, пока l oop.
Как перейти на время l oop, когда все данные считываются из канала?
Еще одна проблема: почему rm $fifo_file после exec 6<>$fifo_file?

Попробуйте, как @chepner скажет:

vim pipe.sh
#!/bin/bash
fifo_file=fifo.pipe
mkfifo $fifo_file
exec 6<>$fifo_file
rm $fifo_file

DateWrite ()
{
    i=0
    while [ $i -lt 100 ]
    do
        str=`date`
        i=$(( i+1 ))
        echo "$i $str"
    done
}

writers=()
for  (( i=0; i<10; i++ ))
do 
     ( DateWrite >&6 ) & writers+=($!)
done

while read date_time
do
    echo $date_time >> output.file
done <&6 &

for writer in "${writers[@]}"; do
  wait "$writer"
done

exec 6>&-

Работает нормально. Здесь две строки, которые я не понимаю.

writers=()
 ( DateWrite >&6 ) & writers+=($!)

Что это значит?

1 Ответ

3 голосов
/ 04 мая 2020

Ваш while l oop будет пытаться читать из канала, пока он открыт для записи. Как только все авторы закончили, вы можете явно закрыть канал.

fifo_file=fifo.pipe
mkfifo $fifo_file
exec 6<>$fifo_file
rm $fifo_file

writers=()
for  (( i=0; i<10; i++ ))
do 
     ( DateWrite >&6 ) & writers+=($!)
done

while read date_time
do
    echo $date_time >> output.file
done <&6 &

for writer in "${writers[@]}"; do
  wait "$writer"
done

exec 6>&-
...