名前付きパイプは、リーダーが接続された順序を尊重しないのはなぜですか?

名前付きパイプは、リーダーが接続された順序を尊重しないのはなぜですか?

次のテスト スクリプトがあります:

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

関連情報