为什么在 shell 脚本中使用 sleep 命令时,它是一个独立的进程,而其他命令似乎不是?

Yve*_*ves 1 bash process sleep

我正在我的 Ubuntu 上编写一个名为如下的bash脚本:test.sh

#!/bin/bash

while true; do
    echo 'abc'   # pwd, df...
    sleep 1
done
Run Code Online (Sandbox Code Playgroud)

当我./test.sh在一个终端执行时,我打开另一个终端来执行以下命令:

$ pgrep test
31110
$ ps -ef | grep sleep
me       31140  31110  0 20:58 pts/1    00:00:00 sleep 1
me       31142  16389  0 20:58 pts/0    00:00:00 grep --color=auto sleep
$ ps -ef | grep sleep
me       31146  31110  0 20:58 pts/1    00:00:00 sleep 1
me       31148  16389  0 20:58 pts/0    00:00:00 grep --color=auto sleep
$ ps -ef | grep sleep
me       31150  31110  0 20:58 pts/1    00:00:00 sleep 1
me       31152  16389  0 20:58 pts/0    00:00:00 grep --color=auto sleep
Run Code Online (Sandbox Code Playgroud)

所以,进程的PID./test.sh31110,当我执行命令时ps -ef | grep sleep,我得到许多进程sleep 1(PID是31140,,31146... 31150),它们都是该进程的子进程./test.sh

好吧,现在看来我可以理解一切, 的子进程sleep 1来自 的循环while true

然而,当我尝试时ps -ef | grep echo,我什么也没得到。我还尝试执行其他命令,例如pwd, df,但它们也无法grep编辑。

所以我的问题是为什么该命令sleep是一个独立的进程而其他命令不是。

Adm*_*Bee 5

这里有两个方面需要考虑:

  1. echo并且pwd确实不能显示为独立进程,因为它们是bashshell 的内置命令(请参见type echo例如的输出 - 但请注意,它们很好地可以实现为外部可执行文件,并且什么是或不是作为内置或外部程序实现的确实有所不同从外壳到外壳)。
  2. 另一方面,由 shell 启动的调用外部可执行文件(例如df)的命令独立的进程,但它们通常完成得如此之快,以至于您将很难用 , “捕获”它们ps(即,它们在ps启动时已经完成并为这个原因不会出现在输出中)。