Você precisa substituir o | por && ou deixar o script gerar os dados para o stdout e usar | .
Ao usar && , o comando mail só será executado quando o script sair com 0.
Ao usar o caractere pipe, seu script precisa enviar os dados para o stdout para que o pipe possa passá-lo para mail .
No que você escreveu, o script grava dados no arquivo e mail lê o arquivo em paralelo - e mail acaba lendo o arquivo antes que o script tenha escrito alguma coisa nele .