附加多个文件时,Unix 邮件中附件丢失

附加多个文件时,Unix 邮件中附件丢失

我正在尝试在 Unix 中附加多个文件,这些文件是命令的结果find。当我尝试发送邮件时,附件丢失。

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]

这段代码有什么问题?

答案1

如果uFiles最终包含字符串foo bar qux,则最后一行(foo使用参数bar和运行命令qux)。这会导致错误消息(foo: command not found(或类似消息),并mail得到空输入。

这并不是剧本的唯一问题。构建uFiles变量的命令根本不执行您认为的操作。运行bash -x /path/to/script查看脚本的痕迹,它会让您了解发生了什么。您正在echo执行该uuencode命令而不是运行它。你不需要echo那里:

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

这将使循环工作,但它很脆弱;特别是,它会破坏包含空格和其他特殊字符的文件名(请参阅为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?以获得更多解释)。解析 的输出find很少是做某事最简单的方法。相反,告诉find执行您想要执行的命令。

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

其输出是您尝试构建的 uuencoded 文件的串联。您可以将其作为输入mail直接传递给:

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

如果您想检测 uuencode 步骤的潜在失败,您可以将其填充到一个变量中(但要注意它可能非常大):

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]

或者,写入临时文件。

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"

相关内容