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