Bash (command1 command2)和(command1;command2)之间有什么区别?

Bash (command1 command2)和(command1;command2)之间有什么区别?,bash,Bash,(command1 command2)和(command1;command2)之间有什么区别? 任何人都可以对此给出一些详细的解释。这是我的测试结果: ( a=3; echo $a) #the result is 3 但是 a=3;echo$a是两个命令a=3 echo$a是一个命令(很明显,它不能是两个命令,因为您不能说echo foo echo bar并期望这两个命令正确计算),它在a=3的环境中计算命令。Bash手册在“简单命令”下定义了此语法: 一个简单的命令是一系列可选变量赋值,后跟

(command1 command2)
(command1;command2)
之间有什么区别? 任何人都可以对此给出一些详细的解释。这是我的测试结果:

( a=3; echo $a) #the result is 3
但是


a=3;echo$a
是两个命令
a=3 echo$a
是一个命令(很明显,它不能是两个命令,因为您不能说
echo foo echo bar
并期望这两个命令正确计算),它在
a=3
的环境中计算命令。Bash手册在“简单命令”下定义了此语法:

一个简单的命令是一系列可选变量赋值,后跟空格分隔的单词和重定向,并由控制运算符终止

重要的一点是顺序:变量替换是第一件发生的事情;然后前缀赋值将改变子环境;然后对命令进行求值

详细说明:第一个,
a=3;echo$a将

1) 在当前环境中评估
a=3
并插入绑定
a=3

2) 通过替换当前环境变量来计算
echo$a
,获得
echo 3
,然后输出
3

第二个比较复杂
a=3 echo$a
,作为单个命令,将

1) 通过替换当前环境变量来评估
a=3 echo$a
。由于未定义
a
,因此我们获得
a=3 echo”“
。然后它创建一个新环境,其中
a=3
,并在那里计算
echo”“

如果将命令切换为
a=3bash-c'echo$a'
,则更容易看到。由于
$a
是单引号,因此不会对其求值,因此命令将在
a=3
的环境中运行
bash-c'echo$a'
bash
随后将在其环境中评估其命令
echo$a
,该环境现在将包括
a=3
,获取
echo 3
,并打印3

将其与
a=3bash-c“echo$a”
进行对比是很有趣的。由于
$a
是双引号,因此将对其进行评估;命令变为
bash-c'echo”“
,然后在
a=3
的子环境中计算,打印一个空行

另一个区别是
a=3 echo$a
a=3
的子环境中运行
echo
,但在该行之后
a
又回到未定义状态(或具有之前的任何值)。在
a=3;echo$a
,当前环境将永久更改,
$a
将被
3
,直到再次更改

( a=3 echo $a) #the result shows nothing