Answers:
是。分叉的拼写是&
:
echo child & echo parent
可能使您感到困惑的$$
不是外壳程序进程的PID,而是原始外壳程序进程的PID 。这样做的目的在于,它$$
是Shell脚本的特定实例的唯一标识符:它在脚本执行期间不会更改,并且与$$
任何其他同时运行的脚本不同。获取shell进程的实际PID的一种方法是sh -c 'echo $PPID'
。
Shell中的控制流与C不同。如果在C中,您将编写
first(); fork(); second(); third();
那么等效的外壳是
after_fork () { second; third; }
first; after_fork & after_fork
简单的外壳形式first; child & parent
对应于通常的C习惯用法
first(); if (fork()) parent(); else child();
&
并且$$
在每个Bourne样式的shell和(t)csh中都以这种方式存在和表现。$PPID
在原始的Bourne外壳中不存在,但在POSIX中存在(因此位于ash,bash,ksh,zsh等)。
&
是fork,不涉及执行程序。当您启动外部命令时,将使用Fork + exec。
exec
,但是两种语言的控制流程确实不同。
&
启动一个子shell,在该子shell中执行给定命令。前叉+执行 您不能只放置&
没有前面的命令来执行。
&
一行。但是你不能。这并不意味着“在这里叉子”。它的意思是“在子外壳程序的后台执行前面的命令”。
是的,它称为subshells。括号内的Shell代码作为子Shell(分支)运行。但是,第一个外壳通常会等待孩子完成。您可以使用&
终止符使其异步。看到这样的效果:
#!/bin/bash
(sleep 2; echo "subsh 1")&
echo "topsh"
$ bash subsh.sh
&
是叉子。如果您想在子进程中执行多个管道,则只需使用花括号(无需创建子进程即可执行分组)就足够了:{ sleep 2; echo child; } &
没有本机bash(或者据我所知,没有其他任何典型的* nix shell)的方式。有很多方法可以生成派生的进程,这些进程可以异步执行其他操作,但是我认为没有任何事情可以遵循fork()系统调用的确切语义。
典型的方法是让您的顶级脚本派生出仅执行您要拆分的工作的助手。如果您这样做$0 $@ &
,则将重新开始,并且需要以某种方式弄清楚。
我实际上已经开始思考可能会做到这一点的几种巧妙方法。
但是,在我的头脑不被这吓倒之前,我认为一个不错的规则是:如果您试图在shell中编写某些东西,并且它充满了聪明的窍门,并且您希望有更多的语言功能,那么您应该花点时间来切换到一种真正的编程语言。