為什麼命名管道不尊重讀取器的附加順序?

為什麼命名管道不尊重讀取器的附加順序?

我有這個測試腳本:

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

相關內容