複数のファイルを添付すると、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(foobarqux)(foo: command not foundmail

スクリプトの問題はこれだけではありません。変数を作成するコマンドは、uFilesあなたが思うものとまったく機能しません。実行してbash -x /path/to/scriptスクリプトの痕跡を確認すると、何が起こっているのかがわかります。コマンドを実行する代わりにコマンドをecho実行しています。そこにはuuencode必要ありませんecho

  uFiles="$uFiles
  $(uuencode "$fil" "$fil")"

これによりループが機能しますが、特に壊れやすいです。スペースやその他の特殊文字を含むファイル名が破損しています(参照)。スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?詳細な説明は)解析された出力は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"

おすすめ記事