目前我知道的主要有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 program
ls | wc
ls
wc
有趣的是,将其包含在管道中可能会导致一个内置的 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
不影响主壳。