Вы говорите:
... похоже, что само назначение считается командой... с нулевым значением выхода, но которая применяется перед правой частью присваивания (например, вызов подстановки команды...)
Это не такой уж плохой способ взглянуть на это. Но это небольшое упрощение. Общий статус возврата из
A=$(cmd1) B=$(cmd2) C=$(cmd3) D=$(cmd4) E=mc2
- это статус выхода из cmd4
.
Назначение E=
, которое происходит после назначения D=
.
не устанавливает общий статус выхода в 0.
Кроме того, как указывает icarus , переменные могут быть установлены как readonly. Рассмотрим следующий вариант примера icarus:
$ err() { echo "stdout $*"; echo "stderr $*" >&2; return ${1:-1}; }
$ readonly A
$ Z=$(err 41 zebra) A=$(err 42 antelope) B=$(err 43 badger)
stderr 41 zebra
stderr 42 antelope
bash: A: readonly variable
$ echo $?
1
$ printf "%s = %s\n" Z "$Z" A "$A" B "$B"
Z = stdout 41 zebra
A =
B =
$
Несмотря на то, что A
является readonly,
bash выполняет подстановку команды справа от A=
-...
и then прерывает команду, потому что A
доступен только для чтения.
Это еще больше противоречит вашей интерпретации
что значение выхода из присваивания применяется
перед правой частью присваивания.
Я рекомендую вам использовать mutt
для отправки писем с вложениями из скриптов:
$ cat mail.txt | \
mutt -s 'My Subject' \
-a /path/file1 /path/file2 /path/file3 /path/file4 \
-- email@example.com
Вам необходимо использовать -
для разделения вложенных файлов и адреса назначения.
Лично я использую mutt
для чтения и отправки писем.
Предполагается, что ваш файл filenames.txt
:
/path/to/file1
/path/to/file2
Я бы написал:
mutt -s "Subject" -a $(<filenames.txt) -- dest@example.com < mailbody.txt