linux – 为什么shell命令“{command1; command2:}&“打开子shell?

众所周知,在花括号之间放置一个命令列表会导致列表在当前的 shell上下文中执行.没有创建子shell.但是当使用“&”时在“{}”之后,为什么要创建两个子壳? pid 1002和1003.

{
    ./a.out
} &

sleep 19

enter image description here

使用“./a.out&”时,只创建一个子shell. pid 17358.

./a.out &
sleep 19

enter image description here

为什么?

解决方法

列表的后台执行使用子shell,因为某些东西需要等待该列表的每个成员并运行下一个成员.列表背景化后,父shell需要可用于新命令;它也无法管理后台列表. bash一次不能做多件事.因此,为了使后台列表工作,它运行一个子shell.

请注意,您可以拒绝后台列表,它将继续运行,表明子shell正在执行其工作:

${
> sleep 1; sleep 2; sleep 3; sleep 4; sleep 5
> } &
$disown
$ps -f | grep sleep
dave     31845 31842  0 03:50 pts/1    00:00:00 sleep 3 
dave     31849 31771  0 03:50 pts/1    00:00:00 grep sleep

您甚至可以注销,子shell将继续运行列表中的进程.

当您对单个命令进行后台处理时,不需要子shell,因为在运行该命令后,shell不再需要执行任何操作.

在您的示例中,第二个附加bash子进程PID 1002似乎是您正在执行的脚本.这与列表背景机制无关(概念上至少);单独文件中的任何脚本都有自己的bash进程.

相关文章

/etc/sysctl.conf这个目录主要是配置一些系统信息,/etc/sys...
1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起...
它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅...
不管是我们在安装软件还是监测软件的使用性能,我们都要随时...
装好Tomcat7后,发现除了本机能访问外界访问不了,岂有此理。...
修改防火墙配置需要修改 /etc/sysconfig/iptables 这个文件,...