( command1 command2 )和( command1; command2)有什么区别?任何人都可以对此作一些详细的解释。这是我的测试结果:
( a=3; echo $a) #the result is 3但
( a=3 echo $a) #the result shows nothing发布于 2018-06-25 07:02:39
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=3 bash -c 'echo $a',则更容易查看。由于$a是单引号,因此不会对其进行计算,因此该命令将在bash -c 'echo $a'环境中运行a=3。然后,bash将在其环境中计算其命令echo $a,该命令现在将包括a=3、获取echo 3和打印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将是3,直到再次更改为止。
https://stackoverflow.com/questions/51017784
复制相似问题