De Quel est le dernier argument de la commande précédente?
shellcheck vous dit de ne pas exporter les variables sur la même ligne que vous les affectez.
Je me demandais pourquoi?
Est -ce que les mêmes conseils à appliquer alias
, declare
, export
, local
, readonly
et typeset
?
export
cession ensemble. L' héritage Bourne Shell , par exemple, fournit en sortie un « foo = 2 ne soit pas un identificateur » erreur.Réponses:
Le problème est que dans Bash, chaque commande n'a qu'un code de sortie. Lorsque vous
export foo="$(false)"
le code de sortie defalse
est simplement supprimé. Si vous faites plutôtla première commande défaillante peut être activée, par exemple par le
errexit
réglage.Déclarer et affecter un littéral tel que,
export foo='bar'
bien sûr, ne souffre pas de ce problème. Mais le changement est la seule constante dans le développement de logiciels, et il est simplement bon de le garder pour assurer la pérennité de telles déclarations en les séparant.Outre les commandes spécifiques aux affectations que vous mentionnez, il existe également plusieurs commandes dans une même affectation, telles que
foo="$(false)$(true)"
. Voirpipefail
dansman bash
pour un autre tel piège.Une autre chose à retenir est que la séquence de déclaration et d'assignation est parfois pertinente. Par exemple, vous voudrez déclarer des variables avant de les affecter. (Malheureusement, il n'est pas possible de déclarer des variables avant de les affecter pour la première fois.)
local
readonly
la source
export
. Par conséquent, pendant plusieurs années, il a été jugé utile de le faire si son interprète était probablement le shell Bourne.foo=$(cmd) export foo
, mais avec la même réserve quecmd
l'état de sortie est perdu (mais a entraîné la sortie du shell en cas d'échecset -e
).