Falta un archivo adjunto en el correo de Unix cuando se adjuntaron varios archivos

Falta un archivo adjunto en el correo de Unix cuando se adjuntaron varios archivos

Estoy intentando adjuntar varios archivos en Unix, que son el resultado de un findcomando. Cuando intento enviar el correo, faltan los archivos adjuntos.

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]

¿Qué está mal con este código?

Respuesta1

Si uFilestermina conteniendo la cadena foo bar qux, entonces la última línea ejecuta el comando (foocon los argumentos bary qux). Esto da como resultado el mensaje de error (foo: command not found(o similar) y mailobtiene una entrada vacía.

Ese no es el único problema con el guión. El comando que genera la uFilesvariable no hace en absoluto lo que usted cree que hace. Corre bash -x /path/to/scripta ver un rastro del script, te dará una idea de lo que está pasando. Estás echoejecutando el uuencodecomando en lugar de ejecutarlo. No necesitas echoallí:

  uFiles="$uFiles
  $(uuencode "$fil" "$fil")"

Eso hará que el bucle funcione, pero es frágil; en particular, se romperá en nombres de archivos que contengan espacios y otros caracteres especiales (consulte¿Por qué mi script de shell se atasca con espacios en blanco u otros caracteres especiales?para más explicaciones). Analizar el resultado de findrara vez es la forma más fácil de hacer algo. En su lugar, indique findque ejecute el comando que desea ejecutar.

find "$dir" -ctime -2 -type f -name "Sum*pdf*" -exec uuencode {} {} \;

El resultado de esto es la concatenación de los archivos codificados sin formato que estaba intentando compilar. Puedes pasarlo como entrada maildirectamente a:

find "$dir" -ctime -2 -type f -name "Sum*pdf*" -exec uuencode {} {} \; |
mailx -s "subject" [email protected]

Si desea detectar posibles fallas en el paso uuencode, puede incluirlo en una variable (pero tenga en cuenta que puede ser muy 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, escriba un archivo temporal.

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"

información relacionada