Você não pode definir e usar fd
no mesmo comando; você está efetivamente fazendo exec {fd}> ... >&$fd
. O que pode funcionar é criar primeiro o fifo / pipe bash, usando algum comando simples como :
. Por exemplo:
startServer(){
local connected=0 fd
exec {fd}<> <(:)
nc -q 0 -l -p "$PORT" <&$fd |
while read -r line
do if [ "$connected" == "0" ]
then startServer $(($1+1)) &
connected="1"
fi
echo server $1 logic goes here
done >&$fd
exec {fd}<&-
}