子壳和子壳是一样的吗

14 shell bash process posix subshell

有这两个名称:subshel​​lchild-shell

是的,子进程将通过以下任一方式启动:

sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat
Run Code Online (Sandbox Code Playgroud)

是否全部相同并共享相同的名称?所有共享相同的属性吗?


POSIX有这个定义

一个shell执行环境包括....

但是上面链接的最后一段是这样的:

子shell 环境应创建为shell 环境的副本,除了未被忽略的信号陷阱应设置为默认操作。

特别是:

命令替换、用括号分组的命令和异步列表应在子 shell 环境中执行。另外,多命令管道的每个命令都在一个子shell环境中;....

sh -c 'echo "Hello"'不包括有,应该是可以称为子shell?

Gil*_*il' 17

子外壳复制现有外壳。它具有相同的变量fork¹ 、相同的功能、相同的选项等。在幕后,使用系统调用²创建了一个子shell ;当父进程等待(例如,$(…))或继续其生命(例如,… &)或以其他方式做它所期望的(例如,… | …)时,子进程继续做它所期望的事情。

sh -c …不创建子shell。它启动另一个程序。那个程序恰好是一个shell,但这只是一个巧合。该程序甚至可能是一个不同的外壳程序(例如,如果您sh -c …从 bash运行,并且sh是 dash),即,一个完全不同的程序,它的行为恰好具有显着的相似性。在幕后,启动外部命令(sh或任何其他命令)会调用fork系统调用,然后execve调用系统调用以子进程中的 shell 程序替换为另一个程序(此处sh)。

¹包括$$,但不包括某些特定于 shell 的变量,例如 bash 和 mksh 的BASHPID.
²至少,这是传统和通常的实现方式。如果 Shell 可以模拟其他行为,则它们可以优化分叉。

相关手册页:fork(2)execve(2)

  • @cuonglm 与“子壳”不同,“子壳”不是具有特定含义的技术术语。如果它是一个孩子的壳,那么它就是一个子壳,遵循通常的英语规则。 (2认同)