首页 > 解决方案 > ps -ef | grep * 命令无法正常工作

问题描述

我有如下简单的 unix shell 脚本。这为服务提供了不同的计数

#!/bin/bash
service=$1

ps -ef | grep $service | grep -v "grep" | wc -l 
PROCESS_NUM=$(ps -ef | grep $service | grep -v "grep"| wc -l) 
echo $PROCESS_NUM

在上面的代码中,下面的行给出了 2 的输出。

ps -ef | grep $service | grep -v "grep" | wc -l 

但是,当同一行被分配给变量时,其输出为 3。

PROCESS_NUM=$(ps -ef | grep $service | grep -v "grep"| wc -l) 
echo $PROCESS_NUM

为什么这会增加 1 以及如何解决它。

标签: shellunixsh

解决方案


如果脚本在计算行数之前将输出发送到文件,然后在之后显示输出,您可以看到发生了什么:

#!/bin/bash
service=$1

echo Directly in Script:
ps -ef | grep $service | grep -v grep | tee test.txt | wc -l
cat test.txt

echo Inside Subshell:
RESULT=$(ps -ef | grep $service | grep -v grep | tee test.txt | wc -l)
echo $RESULT
cat test.txt

捕获命令的输出后,bash 会启动另一个 shell 来运行该命令 - 但该子 shell 也会显示在进程列表中。

当我运行该脚本时,我得到:

$ ./test.sh lca
Directly in Script:
2
gcti      4268     1  0  2018 ?        21:59:03 ./lca 4999
t816826   9159  7009  0 09:22 pts/1    00:00:00 /bin/bash ./test.sh lca
Inside Subshell:
3
gcti      4268     1  0  2018 ?        21:59:03 ./lca 4999
t816826   9159  7009  0 09:22 pts/1    00:00:00 /bin/bash ./test.sh lca
t816826   9166  9159  0 09:22 pts/1    00:00:00 /bin/bash ./test.sh lca

推荐阅读