Parece um erro no zenity. Você pode ver o que está acontecendo usando a ferramenta strace
(eu agrupei as linhas de strace neste post para facilitar a leitura).
Com a versão do pipe, esta linha no strace mostra o que acontece quando o pipe é fechado (porque cat
sai):
poll([{fd=4, events=POLLIN}, {fd=3, events=POLLIN}, {fd=0, events=POLLIN}], \
3, 0) = 1 ([{fd=0, revents=POLLIN|POLLHUP}])
Essa parte no final - fd=0, revents=POLLIN|POLLHUP
, em particular POLLHUP
- diz a zenity que stdin desligou (o gravador do pipe foi embora). O Zenity está processando isso corretamente e fechando o fd 0 depois.
Os arquivos não recebem POLLHUP
events - em vez disso, um resultado read(2)
de zero significa EOF. Este é um caminho de código diferente para o zenity. Pesquise novamente por fd 0 e é isso que acontece:
poll([{fd=4, events=POLLIN}, {fd=3, events=POLLIN}, {fd=0, events=POLLIN}],\
3, 0) = 1 ([{fd=0, revents=POLLIN}])
read(0, "", 1024) = 0
Esse deve ser o fim dele - a leitura zero deve fazer com que o zenity feche o fd 0. Mas isso não acontece. A saída de strace acima continua repetindo, pois o zenity mantém o polling fd 0. Até que fd 0 seja fechado, ele estará sempre pronto para leitura, pois é assim que os descritores de arquivo no EOF funcionam, já que você precisa lê-lo para obter o resultado EOF.
Como o zenity não está respondendo corretamente a EOF em stdin, ele continua em loop em um loop poll(2)
/ read(2)
, onde poll
retorna imediatamente, assim como read
. Mais uma vez, e de novo e de novo ...