bash命令替换的结果不一致

亚历克斯

我有一个剧本。

猫/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变为fork,从而创建两个(几乎)相同的过程。同样,我基本上是指除进程ID,父进程ID,的返回码之外的所有内容fork,而我什么也想不起。但有一点确实保持相同可以肯定的是命令行。它们都将是“ /bin/bash /root/test/ddd.sh”。因此,在中result=$(...),将恰好有一个匹配的额外过程。

例如,您可以通过删除| wc -l末尾的代码来查看该代码$(...),并使其更易读,将echo的参数用引号引起来:

result="$(ps -ef | grep $s | grep -v grep)"
echo "$result"

在这里,您将看到有两个引用,其中一个的PPID是另一个的PID,显示了父子关系。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章