微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

{ ./a.out } & sleep 19

当使用“./a.out&”时,只会创build一个子shell。 pid 17358。

./a.out & sleep 19

一个grep的string之后获取文件中的所有内容

sed在Linux中replaceASCII字符

Shell脚本 – 查找今天修改文件,创build目录,并将其移动到那里

Linux:安装后在我的/ bin /或/ usr / bin中找不到expect。 我如何find它?

使用shell脚本来调用多个ROS启动文件

为什么?

以最小的顺序列出文件

不能设置docker机环境variablesbash

将所有脚本参数复制到另一个variables

C#到单一的GetConsoleWindowexception

我怎样才能把当前运行的Linux进程放在后台

后台执行列表使用子外壳,因为需要等待该列表的每个成员并运行下一个列表。 在列表背后,父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过程。

如果一个命令被控制操作符&终止,那么shell会在后台 (或者异步地)在 shell中执行命令(或者封装在{...}中的命令列表)。

shell不会等待命令完成,返回状态为0。

在C程序中,通过执行fork()后执行execvp()系统调用来完成。

更新:基于下面的评论和更新的问题。 这是发生了什么事。

当你运行:

./a.out &

BASH直接在后台运行a.out作为运行二进制文件a.out不需要单独的shell进程。

当你运行:

{ ./a.out; } &

BASH必须首先fork和创建一个子shell,因为你可以在{...}里面有一系列命令,然后新分叉的subshel​​l在一个单独的进程中运行a.out 。 所以BASH不是为此创造2个子壳。 只有一个子shell被创建,你看到的第二个pid是a.out 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐