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+=($!)
Что это значит?