如果我这样做:
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 也可以识别该换行符。