bash 运行的程序是否在新作业中运行?

bash 运行的程序是否在新作业中运行?

这个视频,据说:

在正常情况下,如果您打开一个终端,并且内部有一个 shell 正在运行,则该 shell 代表新会话的开始。该会话从一项作业开始,其中包含 shell 进程。当 shell 在前台运行管道时,该管道的进程将作为现有作业的进程运行。

而在著名的TTY 揭秘,当 shell 在前台运行管道时,它似乎是新作业的一部分。什么是正确的?

在此输入图像描述

答案1

这取决于你所说的“程序”是什么意思。

首先,视频摘录中的内容具有误导性:“该会议以一开始工作,包含shell进程。“ 正如中所解释的作业和流程有什么区别?并且正如POSIX 工作定义, A工作 是一个 shell 概念。因此,正在运行的 shell 本身并不是一项作业,除非它是来自父shell进程。在摘录中,父进程是终端其中,正如中所解释的巴什指南,只是一个图形界面程序,用于运行基于文本的界面程序,这些程序不一定是 shell。

下面是一些命令来说明该表来自TTY 揭秘是准确的:

$ cat
hello
hello
^Z
[1]+  Stopped                 cat
$ cat | sort
^Z
$ jobs
[1]-  Stopped                 cat
[2]+  Stopped                 cat | sort

您可以在最后的输出中看到存在两个作业:catcat | sort,后者相当于ls | sort表中的 。

至于“bash运行的程序是否在新作业中运行”,POSIX定义:

工作

一组进程,包括 shell 管道及其派生的任何进程,它们都位于同一进程组中。

因此,如果您认为“一组包含 shell 管道的进程”是一个正在运行的程序(您可以根据程序是一组要执行的指令来判断),那么是的。

但由于“程序”是一个比“shell 管道”更通用的概念,因此 bash 运行的程序通常并不在新作业中运行。例如cat, 和sort也是程序,但它们并不各自在单独的作业中运行。

还,shell 内置函数是“程序”,因为它们是“指令集”。但它们是 shell 程序本身的嵌入式组件,因此不一定需要创建单独的子进程来执行。在它们不是在单独的子进程中执行的情况下,它们不能成为 shell 作业的一部分。

答案2

是的,它确实。您可以通过在 ^Z 之后输入来从 shell 中生成它bg,它将继续在自己的 PID 下运行。

相关内容