Прикрепленное изображение отсутствует в почте 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" abc@gmail.com 

Что не так с этим кодом?

Если uFiles заканчивается с строкой foo bar qux , тогда последняя строка запускает команду (foo с помощью bar аргументов и qux) . В результате появляется сообщение об ошибке (foo: command not found (или аналогична), а mail получает пустой ввод.

Это не единственная проблема с скриптом. Команда, которая создает переменную uFiles вовсе не делает то, что вы думаете. Запустите bash -x /path/to/script чтобы увидеть след скрипта, он даст вам представление о том, что происходит. Вы выполняете команду 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" abc@gmail.com 

Если вы хотите обнаружить потенциальные сбои на этапе 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" abc@gmail.com 

Кроме того, напишите временный файл.

 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" abc@gmail.com <"$attachments"