Shell-Script

附加多個文件時,Unix 郵件中缺少附件

  • June 21, 2014

我正在嘗試在 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" abc@gmail.com

這段程式碼有什麼問題?

如果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" abc@gmail.com

如果要檢測 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" abc@gmail.com

或者,編寫一個臨時文件。

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" abc@gmail.com <"$attachments"

引用自:https://unix.stackexchange.com/questions/138275