Проблема в том , что в Bash каждая команда имеет только один код выхода. Когда вы export foo="$(false)"выходной код falseпросто отбрасывается. Если вы вместо этого делаете
foo="$(false)"
export foo
на первую неудачную команду можно воздействовать, например, errexitнастройкой.
Объявление и назначение строкового литерала, такого как export foo='bar', конечно, не страдает от этой проблемы. Но изменения - это единственная постоянная составляющая в разработке программного обеспечения, и это просто хорошая домашняя работа, чтобы разделить их на будущее.
В дополнение к конкретным командам назначения, о которых вы упоминаете, в одном назначении также есть несколько команд, например foo="$(false)$(true)". См pipefailв man bashтечение еще одной такой ловушки.
Также следует помнить, что последовательность объявления и присваивания иногда важна. Например, вы хотите объявить переменные перед их назначением. (К сожалению, невозможно объявить переменные перед их назначением в первый раз.)local readonly