( command1 command2 )
和( command1; command2)
有什么区别?
任何人都可以对此提供一些详细的解释。这是我的测试结果:
( a=3; echo $a) #the result is 3
但是
( a=3 echo $a) #the result shows nothing
答案 0 :(得分:3)
a=3; echo $a
是两个命令。 a=3 echo $a
是一个命令(很明显它不能是两个命令,因为您不能说echo foo echo bar
并期望这两个命令能够正确求值),它在{{1 }}。 Bash手册在“简单命令”下定义了此语法:
一个简单的命令是一系列可选的变量赋值,后跟空格分隔的单词和重定向,并由控制操作符终止。
重要的是顺序:变量替换是首先发生的事情;然后前缀分配将更改子环境;然后评估命令。
详细:第一个a=3
将
1)评估a=3; echo $a
并在当前环境中插入绑定a=3
2)通过替换当前环境变量来评估a=3
,获得echo $a
,然后输出echo 3
。
第二个比较复杂。 3
作为一个命令,将
1)通过替换当前环境变量来评估a=3 echo $a
。由于未定义a=3 echo $a
,因此我们获得a
。然后,它将在a=3 echo ""
所在的地方创建一个新环境,并在那里评估a=3
。
更容易看出我们是否将命令切换为echo ""
。由于a=3 bash -c 'echo $a'
是单引号,因此不会被评估,因此该命令将在$a
所在的环境中运行bash -c 'echo $a'
。 a=3
随后将在其环境中评估其命令bash
,该环境现在将包括echo $a
,获取a=3
并打印3。
将其与echo 3
进行对比很有趣。由于a=3 bash -c "echo $a"
被双引号引起来,它将被求值;该命令将变为$a
,然后在子环境bash -c 'echo ""'
中对其进行评估,并打印一个空行。
另一个差异是a=3
在a=3 echo $a
的子环境中运行echo
,但是在那之后,a=3
行又回到未定义状态(或具有任何值)之前)。在a
中,当前环境将永久更改,并且a=3; echo $a
将一直为$a
,直到再次更改。