Маловероятно, что gmake
расширяет символ тильды, поэтому тильда остается в PATH.
Однако оболочка позже расширяет тильду, когда строка PATH снова передается оболочке.
Помимо того факта, что gmake
не расширяет символ тильды, существует еще одна проблема:
gmake
, похоже, реализует ключевое слово export
только для «нормального» Команды оболочки, запускаемые из правил (команды оболочки после вставленного текста TAB). Это не первый случай, когда gmake
вызывает проблемы с его неортогональной реализацией. Gmake например утверждает, что работает на OpenVMS, но метод $ (shell cmd)
не работает на OpenVMS.
Если 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"