次のテスト スクリプトがあります:
#!/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;
)。A が完了するまで待ってから B を開始する場合は、ループまたはリストを使用します。
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