我知道反引号用于命令替换,但为什么这些命令不会影响当前的shell。例如,执行以下命令会将当前工作目录更改为我以前的目录。
ObjectType
另一方面,以下命令会显示我之前工作目录的内容,但不会对其进行更改。
$> cd -
同样,可能还有其他例子,如
$> ls `cd -`
在这里,它确实显示了我的工作目录的内容,但$>ls `PATH=""`
变量没有被更改。
反引号内的命令/表达式是否在子shell中执行?
答案 0 :(得分:2)
在某些编程语言中它的作用类似于eval(exp)
:
它在外部范围内进行评估,这是一个"孩子"当前范围(也称为subshell环境) - 所以它"知道"当前env中的所有变量,只返回结果 - 因此,不会对当前环境造成任何副作用。
Backticks是旧式的,应该使用$()
。要阅读有关命令替换的更多信息,请参阅the docs
答案 1 :(得分:1)
子shell有不同的$BASHPID
- 他们从原始shell中重新fork
。
$ echo $BASHPID; echo "`echo $BASHPID`"; echo $BASHPID
当您在Unix上进行分支时,子进程写入时复制会从父进程继承(或者只是通过急切复制继承)数据。 子进程(子shell)可以读取所有变量,但是写入任何变量都会为子进程创建一个私有副本(或者如果内核没有写入拷贝,它就已经拥有自己的副本了。的东西)。