在 bash 中创建子 shell 有哪些方法?

在 bash 中创建子 shell 有哪些方法?

目前我知道的主要有2种方式:

  • 明确地: 将命令列表括在括号中

  • 隐含地:管道中的每个命令

是否有更多方法(显式或隐式)在 bash 中创建子 shell?

答案1

man bash

  • 如果命令由控制运算符终止&,则 shell 会在子 shell 的后台执行该命令。 shell 不等待命令完成,返回状态为 0。
  • 协进程是前面带有保留字的 shell 命令coproc
    协进程在子 shell 中异步执行,就像命令已使用 & 控制运算符终止一样
  • Shell 内置complete命令:当使用-C command 选项调用时,command在子 shell 环境中执行,其输出用作可能的补全。
  • 命令替换、用括号分组的命令以及异步命令在与 shell 环境重复的子 shell 环境中调用

答案2

这取决于您所说的“子shell”是什么意思。您可能错过了“管道中的每个命令”要点中的要点。 

任何时候你跑步任何(外部)程序(即脚本或二进制可执行文件,与 shell 内置程序相反),除非您使用,否则您将在子进程(或多个进程)中运行它。 shell 分叉并执行程序。  与单独执行的操作一样,不会创建子 shell 。exec programls | wclswc

有趣的是,将其包含在管道中可能会导致一个内置的 shell在子 shell 中运行。考虑这个例子:

$ 读 v# 这是用户输入的内容。

$回显“$v”

$ 回声美洲狮 |读 v

$回显“$v”

第二个read v命令在子 shell 中运行,因为它是echo cougar | read v管道的一部分。因此,该值cougar丢失,并$v保留其最初的值。

同样,像这样的命令

$ echo foo | cd /

$ cd / | cat

$ echo foo | exit

$ exit | cat

不影响主壳。

相关内容