我正在嘗試在 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"