14 shell bash process posix subshell
有这两个名称:subshell和child-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 可以模拟其他行为,则它们可以优化分叉。