使用 ps|wc -l 有或没有 bash 变量的区别

问题描述

使用 bash,我想了解以下不同的输出

ps |wc -l
4

n=$(ps|wc -l)
echo $n
5

我猜 $(ps|wc -l) 指令正在创建一个额外的子进程,但我真的不明白为什么将它添加到 ps 计数中

解决方法

你说过:$( ) 创建一个子进程。因为没有选项的命令 ps 精确地列出了当前 shell 的所有子进程,所以你会多出一行。我通过用 wc 替换 tee 来检查这一点:

$ ps | tee four

    PID TTY          TIME CMD
XXXXXXX pts/5    00:00:00 bash
YYYYYYY pts/5    00:00:00   ps
ZZZZZZZ pts/5    00:00:00   tee

$ : $(ps -H | tee five)
$ cat five

    PID TTY          TIME CMD
XXXXXXX pts/5    00:00:00 bash
YYYYYYY pts/5    00:00:00   bash
ZZZZZZZ pts/5    00:00:00     ps
ΩΩΩΩΩΩΩ pts/5    00:00:00     tee

我还将 -H 传递给 ps,以便它证明流程树。