Estou tentando anexar vários arquivos no Unix, que são o resultado de um find
comando. Quando tento enviar o e-mail, os anexos desaparecem.
dir=$path
echo "Entered into $spr/sum_master"
for fil in `find $dir -ctime -2 -type f -name "Sum*pdf*"`
do
uFiles=`echo "$uFiles ; uuencode $fil $fil"`
done
\($uFiles\) | mailx -s "subject" [email protected]
O que está errado neste código?
Responder1
Se uFiles
acabar contendo a string foo bar qux
, então a última linha executa 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 do roteiro. O comando que cria a uFiles
variável não faz nada do que você pensa que faz. Corre bash -x /path/to/script
para ver um trace do script, vai te dar uma ideia do que está acontecendo. Você está echo
executando o uuencode
comando em vez de executá-lo. Você não precisa echo
de lá:
uFiles="$uFiles
$(uuencode "$fil" "$fil")"
Isso fará com que o loop funcione, mas é frágil; em particular, ele irá quebrar em nomes de arquivos contendo espaços e outros caracteres especiais (vejaPor que meu script de shell engasga com espaços em branco ou outros caracteres especiais?para mais explicações). Analisar a saída find
raramente é a maneira mais fácil de fazer algo. Em vez disso, diga find
para executar o comando que 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 mail
diretamente para:
find "$dir" -ctime -2 -type f -name "Sum*pdf*" -exec uuencode {} {} \; |
mailx -s "subject" [email protected]
Se você deseja detectar possíveis falhas na etapa uuencode, você pode inseri-la em uma variável (mas cuidado, pois ela 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]
Alternativamente, 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"