我正在尝试在 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"