附加多個文件時,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"

相關內容