Se uFiles acabar contendo a string foo bar qux , a última linha executará o comando (foo com os argumentos bar e qux) . Isso resulta na mensagem de erro (foo: command not found (ou similar) e mail obtém uma entrada vazia.
Esse não é o único problema com o script. O comando que constrói a variável uFiles não faz nada do que você acha que faz. Execute bash -x /path/to/script para ver um traço do script, isso lhe dará uma idéia do que está acontecendo. Você está echo ing o comando uuencode em vez de executá-lo. Você não precisa de echo there:
uFiles="$uFiles
$(uuencode "$fil" "$fil")"
Isso fará com que o loop funcione, mas é frágil; em particular, ele quebrará em nomes de arquivos contendo espaços e outros caracteres especiais (veja Por que meu script de shell sufoca em espaços em branco ou outros caracteres especiais? para mais explicações). Analisar a saída de find raramente é a maneira mais fácil de fazer alguma coisa. Em vez disso, diga find para executar o comando que você deseja executar.
find "$dir" -ctime -2 -type f -name "Sum*pdf*" -exec uuencode {} {} \;
A saída disso é a concatenação dos arquivos uuencoded que você estava tentando construir. Você pode passá-lo como entrada para mail diretamente:
find "$dir" -ctime -2 -type f -name "Sum*pdf*" -exec uuencode {} {} \; |
mailx -s "subject" [email protected]
Se você quiser detectar possíveis falhas do passo uuencode, você pode colocá-lo em uma variável (mas cuidado com isso, pode ser muito grande):
attachments=$(find "$dir" -ctime -2 -type f -name "Sum*pdf*" -exec uuencode {} {} \;)
if [ $? -ne 0 ]; then
echo 1>&2 "Error while encoding attachments, aborting."
exit 2
fi
if [ -z "$attachments" ]; then
echo 1>&2 "Notice: no files to attach, so mail not sent."
exit 0
fi
echo "$attachments" | mailx -s "subject" [email protected]
Como alternativa, escreva um arquivo temporário.
attachments=
trap 'rm -f "$attachments"' EXIT HUP INT TERM
attachments=$(mktemp)
find "$dir" -ctime -2 -type f -name "Sum*pdf*" -exec uuencode {} {} \; >"$attachments"
if [ $? -ne 0 ]; then
echo 1>&2 "Error while encoding attachments, aborting."
exit 2
fi
if ! [ -s "$attachments" ]; then
echo 1>&2 "Notice: no files to attach, so mail not sent."
exit 0
fi
mailx -s "subject" [email protected] <"$attachments"