com socat :
mkfifo pipe &&
<pipe socat tcp-listen:"$portB",reuseaddr,fork,bind=localhost - |
socat - tcp:localhost:"$portC" >pipe
Ou melhor ainda (evite o fifo e a camada extra de comunicação entre processos):
socat "tcp:localhost:$portC" \
"exec:\"socat - tcp-listen:$portB,reuseaddr,fork,bind=localhost\",nofork"
Por causa do nofork , o segundo socat seria executado com seu stdin e stdout diretamente conectados ao soquete para C.