为什么不在分配变量的同一行导出变量?

Tim*_*Tim 47 bash

From上一条命令的最后一个参数是什么?

shellcheck 告诉您不要在分配变量的同一行上导出变量。

我想知道为什么?

做了同样的建议适用于aliasdeclareexportlocalreadonly,和typeset

l0b*_*0b0 54

问题是,在击每一个命令只有一个退出代码。当你export foo="$(false)"的退出代码false被简单地丢弃。如果你这样做

foo="$(false)"
export foo
Run Code Online (Sandbox Code Playgroud)

例如,可以通过errexit设置对失败的第一个命令采取行动。

声明和分配一个字符串文字,例如export foo='bar'当然不会遇到这个问题。但是变化是软件开发中唯一不变的,并且通过将它们拆分来使这些陈述面向未来是很好的内务管理。

除了您提到的分配特定命令之外,单个分配中还有多个命令,例如foo="$(false)$(true)". 见pipefailman bash为又一个这样的陷阱。

要记住的另一件事是声明和赋值的顺序有时是相关的。例如,您需要分配变量之前先声明它们。(不幸的是,在第一次分配变量之前无法声明它们。)local readonly