答案1
两者的区别在于()
创建一个子shell。例如,您可以尝试以下操作:
cd $HOME ; ls
这些命令的输出将列出当前用户拥有的文件和目录。
现在,使用 subshell,您可以尝试以下操作:
( cd / ; ls ; ) ; ls
我们在这里所做的是创建一个子shell(cd / ; ls)将当前目录更改为/
然后列出其文件和目录。之后,一旦子 shell 结束,我们就会列出当前目录的文件,但这不是/
目录,在这种情况下,当前目录是用户主文件夹($HOME)
现在,如果你改变()
行为{}
将会有所不同。
{ cd / ; ls ; } ; ls
在这里,输出将列出/
两个ls
命令的目录中的文件和目录。
让我们看另一个例子:
( echo Subshell is $BASH_SUBSHELL ; ) ; echo Subshell is $BASH_SUBSHELL
这些命令将分别回显:
Subshell is 1
Subshell is 0
正如您所看到的,使用环境变量$BASH_SUBSHELL
您可以获得当前的子shell级别,因此,当您使用()
更改时BASH_SUBSHELL
(您可以根据需要使用嵌套子shell)。
还有另一个例子:
( vartmp=10 ; echo var is $vartmp ; ) ; echo var is $vartmp
在这种情况下,输出将是:
var is 10
var is
正如你所看到的,第二行$vartmp
是空的。这是正确的,因为当子 shell 执行结束时,所有变量、函数和一些更改(例如修改环境变量)都将被清除。因此,当您想要显示$vartmp
子 shell 结束后的内容时,输出将为空,因为变量不存在。
您可以尝试更改()
这些{}
命令中的 to 以检查不同的行为。