Attachment missing in Unix mail when multiple files were attached

Маловероятно, что gmake расширяет символ тильды, поэтому тильда остается в PATH.

Однако оболочка позже расширяет тильду, когда строка PATH снова передается оболочке.

Помимо того факта, что gmake не расширяет символ тильды, существует еще одна проблема:

  • gmake , похоже, реализует ключевое слово export только для «нормального» Команды оболочки, запускаемые из правил (команды оболочки после вставленного текста TAB).

Это не первый случай, когда gmake вызывает проблемы с его неортогональной реализацией. Gmake например утверждает, что работает на OpenVMS, но метод $ (shell cmd) не работает на OpenVMS.

1
21.06.2014, 12:16
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" 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"
0
29.04.2021, 00:39

Теги

Похожие вопросы