O redirecionamento < out
faz com que o canal nomeado seja aberto para leitura. Isso bloqueia, desde que nenhum processo tenha o tubo aberto para gravação. Enquanto isso, o lado direito do pipeline está bloqueando no comando read
, aguardando que nc
(que ainda não foi iniciado) exiba algo pelo canal. É um deadlock .
Para permitir que o script continue, verifique se o canal nomeado está aberto para gravação e para leitura independente. Por exemplo:
nc -l 8080 < out | while read line
do
echo hello >&3
echo "$line"
done 3>out
ou
nc -l 8080 < out | {
exec 3>out
while read line
do
echo hello >&3
echo "$line"
done
}
Observe que algo como isto não funcionaria, porque nc
veria que sua entrada é fechada após a leitura de 0 bytes e gravações subseqüentes bloqueariam a espera para o canal nomeado ser aberto novamente para leitura:
nc -l 8080 < out | {
: >out
while read line
do
echo hello >out
echo "$line"
done
}