一行环境变量设置行为

一行环境变量设置行为

如果我这样做:

SUMAN_DEBUG=foo echo $SUMAN_DEBUG

我没有得到任何输出

但如果我这样做:

SUMAN_DEBUG=foo && echo $SUMAN_DEBUG

然后我得到

“富”

这是为什么?

答案1

【这个答案不正确。该问题是由于在命令行上进行变量分配之前发生了变量扩展。请参阅下面的评论。此外,这个问题被宣布为重复问题,并且在原始问题中有很好的讨论。 -gt]

SUMAN_DEBUG=foo是局部变量的局部环境变量赋值,该局部变量仅存在于它前面的命令中。在第二种情况下,没有命令,因为&&启动了一个命令列表,在您的情况下,第一个命令为空(因此环境变量没有影响命令),第二个命令被执行,但没有为其设置环境变量。

您可以添加export到赋值中,以便该变量成为全局环境变量。但在命令列表完成后它会持续存在。

另一种选择是将整个命令列表放在括号中以在子 shell 中执行它:

(export SUMAN_DEBUG=foo && echo $SUMAN_DEBUG)

在这种情况下,持久环境变量将在子 shell 中设置,并且当子 shell 完成其工作时该环境将消失)。

请参阅Bourneagain Shell 手册,列出部分和关于环境了解更多。

答案2

在命令行中,您需要使用;或分隔命令&&。空格不是 CLI 命令的分隔符。

如果第一个命令成功退出(退出代码 0),则将执行&&第二个命令。

;无论第一个命令的退出状态是什么,第二个命令都会被执行。

测试:

# a1;echo hello
bash: a1: command not found
hello
# a1 && echo hello
bash: a1: command not found

在脚本中,第一个命令和第二个命令由换行符分隔\n,bash 也可以识别该换行符。

相关内容