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

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

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

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

我想知道为什么?

同样的建议是否适用于aliasdeclareexportlocalreadonlytypeset

答案1

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

foo="$(false)"
export foo

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

声明并分配一个字符串文字,例如,export foo='bar'当然不会遇到这个问题。但变化是软件开发中唯一不变的,通过将这些语句分开来保证未来的发展,这只是很好的内务管理。

除了您提到的作业特定命令之外,单个作业中还有多个命令,例如foo="$(false)$(true)".看pipefail又陷入man bash了另一个这样的陷阱。

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

相关内容