Anexo ausente no correio Unix quando vários arquivos foram anexados

1

Estou tentando anexar vários arquivos no Unix, que são o resultado de um comando find . Quando tento enviar o e-mail, os anexos estão faltando.

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 há de errado com esse código?

    
por Aravind 20.06.2014 / 15:43

1 resposta

0

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"
    
por 21.06.2014 / 16:47