子()是子壳吗?

leeand00 05/09/2018. 3 answers, 4.198 views
bash subshell syntax

我理解子shell语法是()$()只是一个可以从中检索变量值的子shell?

注意:这适用于bash 4.4,基于其文档中的不同措辞。

3 Answers


Gilles 05/09/2018.

根据定义, $(…)是一个子shell:它是shell运行时状态¹的副本,对子shell中所做状态的更改对父进程没有影响。 子shell通常通过分叉新进程来实现(但是在某些情况下,某些shell可以优化它)。

您不能从子shell中检索变量值。 如果对变量的更改对父级有影响,则它不会是子shell。 它是一个子shell,其父output可以检索。 $(…)创建的子shell将其标准输出设置为管道,父管道从该管道读取并收集输出。

还有一些其他构造可以创建子shell。 我认为这是bash的完整列表:

  • 用于分组的子shell ( … )除了创建子shell并等待它终止之外什么都不做。 与{ … }对比,它将命令纯粹用于语法目的而不创建子shell。
  • 背景… &创建一个子shell,不等待它终止。
  • 管道… | … … | …创建两个子壳,一个用于左侧,一个用于右侧,并等待两个子壳终止。 shell创建一个管道,并将左侧的标准输出连接到管道的写入端,将右侧的标准输入连接到读取端。 在一些shell(ksh88,ksh93,zsh,bash中设置了lastpipe选项并且有效),右侧在原始shell中运行,因此管道构造仅创建一个子shell。
  • 命令替换$(…) (也拼写为`…` )创建一个子shell,其标准输出设置为管道,收集父项中的输出并扩展到该输出,减去其尾随换行符。 (并且输出可能会进一步受到分裂和整合,但这是另一个故事。)
  • 进程替换<(…)创建一个子shell,其标准输出设置为管道并扩展为管道的名称。 父(或其他一些进程)可以打开管道与子shell通信。 >(…)做同样的事情,但标准输入管道。
  • Coprocesscoproc …创建一个子shell并且不等待它终止。 子shell的标准输入和输出均设置为管道,父管道连接到每个管道的另一端。

¹ 与运行单独的shell相反


从bash版本4.4中的bash(1)手册页,“扩展”部分,“命令替换”小节:

Bash通过在子shell环境中执行command来执行扩展[...]


Iskustvo 05/09/2018.

是的, ( commands... )是一个bash子shell,它将在另一个进程中执行commands...

你有$( commands... )的唯一区别是这部分代码将在执行commands...commands...所有内容替换commands...写入stdout

Related questions

Hot questions

Language

Popular Tags