我有一个脚本。
cat /root/test/ddd.sh
#!/bin/bash
s=/root/test/ddd.sh
ps -ef | grep $s | grep -v grep
result=$(ps -ef | grep $s | grep -v grep | wc -l)
echo $result
当我执行它时,结果很奇怪,它表明有两条线匹配。
[root@l2 test]# /root/test/ddd.sh
root 15361 15032 0 09:52 pts/18 00:00:00 /bin/bash /root/test/ddd.sh
2
那是因为你正在运行一个子shell。也就是说,$(...)
片段导致bash到fork
,从而创建两个(几乎)相同的过程。相同,我的意思是基本上除了进程ID,父进程ID,来自fork
的返回代码之外的所有东西,我想不出别的什么。但有一点确实保持不变的是命令行。他们两个都将是“/bin/bash /root/test/ddd.sh
”。因此,在result=$(...)
内部,将会有一个匹配的额外进程。
例如,您可以通过删除| wc -l
末尾的$(...)
片段来看到这一点,并且为了使其更具可读性,请将echo的参数括在引号中:
result="$(ps -ef | grep $s | grep -v grep)"
echo "$result"
在这里你会看到有两个bashes,一个PPID是另一个的PID,显示父子关系。