众所周知,在花括号之间放置一个命令列表会导致列表在当前的
shell上下文中执行.没有创建子shell.但是当使用“&”时在“{}”之后,为什么要创建两个子壳? pid 1002和1003.
{ ./a.out } & sleep 19
使用“./a.out&”时,只创建一个子shell. pid 17358.
./a.out & sleep 19
为什么?
解决方法
列表的后台执行使用子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进程.