名前付きパイプが読者の追加順序を尊重しないのはなぜですか?

名前付きパイプが読者の追加順序を尊重しないのはなぜですか?

このテストスクリプトがあります。

#!/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

関連情報