bash命令替换的结果不一致

问题描述 投票:1回答:1

我有一个脚本。

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
bash
1个回答
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,显示父子关系。

© www.soinside.com 2019 - 2024. All rights reserved.