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

时间:2018-06-25 06:53:47

标签: bash

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

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

但是

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

1 个答案:

答案 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=3a=3 echo $a的子环境中运行echo,但是在那之后,a=3行又回到未定义状态(或具有任何值)之前)。在a中,当前环境将永久更改,并且a=3; echo $a将一直为$a,直到再次更改。