Я пытаюсь прикрепить несколько файлов в 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
ing 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"