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