Вложение отсутствует в почте 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чтобы увидеть трассировку скрипта, это даст вам представление о том, что происходит. Вы echoing 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"

Связанный контент