一行环境变量设置行为

Ale*_*lls 9 shell bash variable-substitution variable assignment

如果我这样做:

SUMAN_DEBUG=foo echo $SUMAN_DEBUG
Run Code Online (Sandbox Code Playgroud)

我没有输出

但如果我这样做:

SUMAN_DEBUG=foo && echo $SUMAN_DEBUG
Run Code Online (Sandbox Code Playgroud)

然后我得到

“富”

这是为什么?

Gre*_*rsa 5

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

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

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

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

(export SUMAN_DEBUG=foo && echo $SUMAN_DEBUG)
Run Code Online (Sandbox Code Playgroud)

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

有关更多信息,请参阅Bourne-again Shell 手册、列表部分和环境部分。

  • 恐怕这是错的。第一个不起作用,因为命令参数在变量赋值发生之前被扩展。第二个有效是因为 `SUMAN_DEBUG=foo` 在当前 shell 的范围内执行赋值(我的术语在这里可能不精确)。@groovenectar 的答案似乎是一种方法。如果打算从子shell 引用变量(例如,您调用期望设置该变量的脚本),那么您使用`export` 的解决方案很有用。 (2认同)

Geo*_*iou 1

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

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

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

测试:

# a1;echo hello
bash: a1: command not found
hello
# a1 && echo hello
bash: a1: command not found
Run Code Online (Sandbox Code Playgroud)

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

  • 变量赋值不是命令。OP 行为的原因是因为扩展发生在赋值之前。 (4认同)