我有一个脚本。
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
答案 0 :(得分:2)
那是因为您正在运行子外壳程序。也就是说,$(...)
件导致bash进入fork
,从而创建了两个(几乎)相同的 进程。同样,我基本上是指除进程ID,父进程ID,来自fork
的返回码之外的所有内容,我什么也想不起。但是可以肯定的是,确实仍然是命令行。它们都将是“ /bin/bash /root/test/ddd.sh
”。因此,在result=$(...)
内部,将有一个完全匹配的额外过程。
例如,通过删除| wc -l
末尾的$(...)
片段,并使其更加可读,可以将回声的参数括在引号中来查看:
result="$(ps -ef | grep $s | grep -v grep)"
echo "$result"
在这里,您将看到有两个基底,其中一个的PPID是另一个的PID,显示了父子关系。