为什么在反引号内执行的命令不会影响当前的shell?

时间:2015-07-12 16:44:08

标签: bash shell

我知道反引号用于命令替换,但为什么这些命令不会影响当前的shell。例如,执行以下命令会将当前工作目录更改为我以前的目录。

ObjectType

另一方面,以下命令会显示我之前工作目录的内容,但不会对其进行更改。

$> cd -

同样,可能还有其他例子,如

$> ls `cd -`

在这里,它确实显示了我的工作目录的内容,但$>ls `PATH=""` 变量没有被更改。

反引号内的命令/表达式是否在子shell中执行?

2 个答案:

答案 0 :(得分:2)

在某些编程语言中它的作用类似于eval(exp)

它在外部范围内进行评估,这是一个"孩子"当前范围(也称为subshell环境) - 所以它"知道"当前env中的所有变量,只返回结果 - 因此,不会对当前环境造成任何副作用。

Backticks是旧式的,应该使用$()。要阅读有关命令替换的更多信息,请参阅the docs

答案 1 :(得分:1)

子shell有不同的$BASHPID - 他们从原始shell中重新fork

$ echo $BASHPID; echo "`echo $BASHPID`"; echo $BASHPID

当您在Unix上进行分支时,子进程写入时复制会从父进程继承(或者只是通过急切复制继承)数据。 子进程(子shell)可以读取所有变量,但是写入任何变量都会为子进程创建一个私有副本(或者如果内核没有写入拷贝,它就已经拥有自己的副本了。的东西)。