Bem, você não faz assim ;-) Boa tentativa!
Você está usando o pipe "|" para gravar a saída do seu comando uuencode para o canal de entrada (também conhecido como stdin, entrada padrão) do comando mail. Você também está usando o redirecionamento de shell "<" para gravar o conteúdo do arquivo body.txt no canal de entrada do seu comando de email.
Isso é ambíguo. Não tenho certeza agora, o que tem precedência, ou como o shell lida com a situação. Você provavelmente acaba com um dos programas pedindo informações.
Melhor esclarecer a casca, o que fazer, em que ordem. Ou seja escrevendo:
(cat body.txt; uuencode text.txt) |mail -s "hai" "[email protected]"
Isso executa cat (a impressora de arquivos) e uuencode de uma só vez (em um subshell para ser preciso, devido ao parêntese) e canaliza a saída comum para o programa de e-mail