我有这个测试脚本:
#!/usr/bin/env bash
fif="foooz"; rm "$fif" ; mkfifo "$fif"
( cat "$fif" | cat && echo "1") &
sleep 0.1
( cat "$fif" | cat && echo "2") &
sleep 0.1
( cat "$fif" | cat && echo "3") &
echo "first" > "$fif"
wait;
我得到的输出是多种多样的,我有这些品种:
first
1
first
2
first
1
2
first
3
我的问题是 - 为什么读者附加到命名管道的顺序不重要/受到尊重?看起来很蹩脚,它几乎是随机的?
答案1
F=example.fifo
mkfifo $F
cat $F | tee -a >( read B; echo "B=$B" >&2 ) >( read C; echo "C=$C" >&2 ) | (read A; echo "A=$A") &
echo OK > $F
A=OK
B=OK
C=OK
rm $F
- ">()" 是进程替换
- 内部三通工作原理这里。
请注意,所有 3 个输出都是同时运行的(通过添加 进行测试sleep 1;
),如果您想在启动 B 之前等待 A 完成,那么只需使用循环或列表即可;
F=example.fifo
mkfifo $F
cat $F | ( read O; echo "A=$O"; echo "B=$O"; echo "C=$O") &
echo OK > $F
A=OK
B=OK
C=OK
rm $F