Estoy intentando adjuntar varios archivos en Unix, que son el resultado de un find
comando. 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 uFiles
termina conteniendo la cadena foo bar qux
, entonces la última línea ejecuta el comando (foo
con los argumentos bar
y qux)
. Esto da como resultado el mensaje de error (foo: command not found
(o similar) y mail
obtiene una entrada vacía.
Ese no es el único problema con el guión. El comando que genera la uFiles
variable no hace en absoluto lo que usted cree que hace. Corre bash -x /path/to/script
a ver un rastro del script, te dará una idea de lo que está pasando. Estás echo
ejecutando el uuencode
comando en lugar de ejecutarlo. No necesitas echo
allí:
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 find
rara vez es la forma más fácil de hacer algo. En su lugar, indique find
que 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 mail
directamente 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"