bash命令替换的结果不一致

时间:2019-03-16 01:59:00

标签: bash

我有一个脚本。

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

1 个答案:

答案 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,显示了父子关系。