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

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

Estou tentando anexar vários arquivos no Unix, que são o resultado de um findcomando. 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 uFilesacabar contendo a string foo bar qux, então a última linha executa o comando (foocom os argumentos bare qux). Isso resulta na mensagem de erro (foo: command not found(ou similar) e mailobtém uma entrada vazia.

Esse não é o único problema do roteiro. O comando que cria a uFilesvariável não faz nada do que você pensa que faz. Corre bash -x /path/to/scriptpara ver um trace do script, vai te dar uma ideia do que está acontecendo. Você está echoexecutando o uuencodecomando em vez de executá-lo. Você não precisa echode 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 findraramente é a maneira mais fácil de fazer algo. Em vez disso, diga findpara 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 maildiretamente 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"

informação relacionada