gpt4 book ai didi

linux - 为什么 (ps -f) 不创建子 shell 而是创建一个单独的进程?

转载 作者:可可西里 更新时间:2023-11-01 11:49:09 25 4
gpt4 key购买 nike

我需要一些帮助,因为我没有得到什么。根据我从 Internet 上读到的内容,当我们执行 shell 脚本或在括号中运行命令时,会创建一个子 shell:( )

我尝试使用仅包含以下命令的脚本对此进行测试:

ps -f

当我运行它时,我看到以下结果:

ID      PID  PPID  C STIME TTY          TIME CMD 
me 2213 2160 0 08:53 pts/14 00:00:00 bash
me 3832 2213 0 18:41 pts/14 00:00:00 bash
me 3833 3832 0 18:41 pts/14 00:00:00 ps -f

这很好,因为我看到我的 bash 进程为我的脚本生成了另一个 bash 进程。

但是当我这样做的时候:

( ps -f )

它产生:

UID     PID  PPID  C STIME TTY          TIME CMD 
me 2213 2160 0 08:53 pts/14 00:00:00 bash
me 3840 2213 0 18:46 pts/14 00:00:00 ps -f

那么,如果括号产生了一个子 shell,为什么它没有显示在进程中?为什么 ps -f 被算作另一个进程?每个命令都作为单独的进程运行吗?

最佳答案

看来您已经在一点点优化中捕获了 bash。如果一个子 shell 只包含一个命令,为什么要把它变成一个子 shell?

$ ( ps -f )
UID PID PPID C STIME TTY TIME CMD
jovalko 29393 24133 0 12:05 pts/10 00:00:00 bash
jovalko 29555 29393 0 12:07 pts/10 00:00:00 ps -f

但是,添加第二个命令,例如 :(bash null 命令,它什么都不做),结果如下:

$ ( ps -f ; : )
UID PID PPID C STIME TTY TIME CMD
jovalko 29393 24133 0 12:05 pts/10 00:00:00 bash
jovalko 29565 29393 0 12:08 pts/10 00:00:00 bash
jovalko 29566 29565 0 12:08 pts/10 00:00:00 ps -f

使用子 shell 的主要原因之一是您可以对一组命令而不是单个命令执行 I/O 重定向等操作,但是如果您的子 shell 仅包含单个命令,则没有太多理由真正 fork 一个首先是新的 bash 进程。

至于ps算作一个进程,则有所不同。您使用的许多命令,如 lsgrepawk 都是外部程序。但是,也有 cdkill 等内置函数。

您可以使用 type 命令确定 bash 中的命令:

$ type ps
ps is hashed (/bin/ps)
$ type cd
cd is a shell builtin

关于linux - 为什么 (ps -f) 不创建子 shell 而是创建一个单独的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25689656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com