Bash 当所有数据都从管道中读取时,如何跳转无限while循环?

Bash 当所有数据都从管道中读取时,如何跳转无限while循环?,bash,pipe,Bash,Pipe,它很好用。 这里有两行我不明白 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 } wr

它很好用。 这里有两行我不明白

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

这意味着什么?

您的while循环将尝试从管道中读取数据,只要它是开放的,可以写入数据。完成所有写入程序后,可以显式关闭管道

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

您的while循环将尝试从管道中读取数据,只要它是开放的。完成所有写入程序后,可以显式关闭管道

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

我试过这个方法,失败了。请检查一下。我不确定你要我检查什么。这段代码对我很有用。请查看我的更新,有两行我不明白,您介意解释一下吗?它们正在收集数组中后台编写器的进程ID,以便您知道以后要等待哪些进程。我尝试了该方法,失败了。请检查。我不确定您希望我检查什么。这段代码对我很有用。请看我的更新,有两行我不明白,你介意解释一下吗?它们正在收集数组中后台编写器的进程ID,以便你知道以后要等待哪些进程。
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>&-