¿Por qué las canalizaciones con nombre no respetan el orden en el que se adjuntaron los lectores?

¿Por qué las canalizaciones con nombre no respetan el orden en el que se adjuntaron los lectores?

Tengo este script de prueba:

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

el resultado que obtengo es variado, tengo estas variedades:

first
1

first
2

first
1
2

first
3

Mi pregunta es: ¿por qué no importa/respeta el orden en el que se adjuntan los lectores a la tubería nombrada? ¿Parece poco convincente que sea casi aleatorio?

Respuesta1

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
  • ">()" es sustitución de procesos
  • funcionamiento interno en Taquí.

Tenga en cuenta que las 3 salidas se ejecutan al mismo tiempo (pruebe agregando sleep 1;), si desea esperar a que A se complete antes de iniciar B, simplemente use un bucle o una lista;

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

información relacionada