shellcheck 告诉您不要在分配变量的同一行导出变量。
我想知道为什么?
同样的建议是否适用于alias
、declare
、export
、local
、readonly
和typeset
?
答案1
这问题在 Bash 中,每个命令只有一个退出代码。当您的export foo="$(false)"
退出代码false
被简单地丢弃。如果你这样做
foo="$(false)"
export foo
可以对失败的第一个命令采取行动,例如通过设置errexit
。
声明并分配一个字符串文字,例如,export foo='bar'
当然不会遇到这个问题。但变化是软件开发中唯一不变的,通过将这些语句分开来保证未来的发展,这只是很好的内务管理。
除了您提到的作业特定命令之外,单个作业中还有多个命令,例如foo="$(false)$(true)"
.看pipefail
又陷入man bash
了另一个这样的陷阱。
另一件要记住的事情是声明和赋值的顺序有时是相关的。例如,您需要声明变量local
前分配他们。 (不幸的是,无法声明变量readonly
在第一次分配它们之前。)