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"