Shell-Script
附加多個文件時,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" abc@gmail.com
這段程式碼有什麼問題?
如果
uFiles
最終包含字元串foo bar qux
,則最後一行執行(foo
帶有參數bar
和的命令qux)
。這會導致錯誤消息(foo: command not found
(或類似消息),並這不是腳本的唯一問題。建構
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 文件的串聯。您可以將其作為輸入
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"