Você está inserindo a tubulação em um loop while. Dentro do loop, stdin vem do comando anterior , não do console. Sua instrução select
está lendo o mesmo canal do qual a instrução read
está lendo.
Além disso, você não precisa de cat
.
Você precisa preservar stdin para usar na instrução select. Tente isto:
while read el; do select yn in "yes" "no"; do echo $yn; break;
done <&4; done 4<&0 < in
Primeiro, observe que estamos redirecionando a entrada usando '<', em vez de usar cat
.
Isto preserva sua origem stdin (fd 0) em fd 4 e, em seguida, dentro do loop redireciona a entrada para select
do fd 4.