От того, что является последним аргументом предыдущей команды?
shellcheck говорит вам не экспортировать переменные в той же строке, в которой вы их присваиваете.
Мне было интересно, почему?
Применим ли тот же совет alias
, declare
, export
, local
, readonly
, и typeset
?
export
и присваивать вместе. Наследуемый Bourne Shell , например, выдает «Foo = 2 не является идентификатором» ошибка.Ответы:
Проблема в том , что в Bash каждая команда имеет только один код выхода. Когда вы
export foo="$(false)"
выходной кодfalse
просто отбрасывается. Если вы вместо этого делаетена первую неудачную команду можно воздействовать, например,
errexit
настройкой.Объявление и назначение строкового литерала, такого как
export foo='bar'
, конечно, не страдает от этой проблемы. Но изменения - это единственная постоянная составляющая в разработке программного обеспечения, и это просто хорошая домашняя работа, чтобы разделить их на будущее.В дополнение к конкретным командам назначения, о которых вы упоминаете, в одном назначении также есть несколько команд, например
foo="$(false)$(true)"
. Смpipefail
вman bash
течение еще одной такой ловушки.Также следует помнить, что последовательность объявления и присваивания иногда важна. Например, вы хотите объявить переменные перед их назначением. (К сожалению, невозможно объявить переменные перед их назначением в первый раз.)
local
readonly
источник
export
, поэтому в течение нескольких лет поступало мудрое решение сделать это, если интерпретатором, вероятно, будет оболочка Bourne.foo=$(cmd) export foo
, хотя с тем же предупреждением, чтоcmd
статус выхода теряется (но вызывал выход из оболочки при сбое сset -e
).