Como explicado aqui , o bash fez a opção de sair apenas quando todos os comandos no pipe terminaram. Aqui, netcat
não deseja parar, mas depois que o pipe final for quebrado, netcat
falhará. É por isso que você precisa esperar mais uma vez para sair do loop (a propósito, você tem um erro quando sai do loop). Aqui está uma versão que não tem esse problema de pipe:
#!/bin/bash
echo "Start listening on port 12345 ..."
while read line
do
if [ "$line" == 'exit' ]; then
echo "Received 'exit'"
break
else
echo "$line"
fi
done < <((echo "Welcome. Please give me one of the following commands: $AVAILABLECOMMANDS") | nc -q -1 -l 12345)
echo "Good bye"