首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >( command1 command2)和( command1;command2 )有什么区别?

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

Stack Overflow用户
提问于 2018-06-25 06:53:46
回答 1查看 251关注 0票数 1

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

代码语言:javascript
复制
( a=3; echo $a) #the result is 3

代码语言:javascript
复制
( a=3 echo $a) #the result shows nothing
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,直到再次更改为止。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51017784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档