shell判断当前执行脚本的进程数的坑
#!/bin/bash
p=$(/bin/ps -ef | grep -w “$0”|grep -v ‘grep’|wc -l)
echo “$p”
得到的结果居然是2
通过whille true循环抓进程才发现,这个脚本执行过程中产生了子进程!
因此得到结果是大于1的.
为了避免这个情况,可以将脚本改造一下:
#!/bin/bash
p=ps -ef|grep "$0"|grep -v grep
echo $p|wc -l
这样得到的结果就是1.原因是这里的p获取的进程信息实际上也是两个,但是两个输出在一行中,所以最后去wc得到的结果是1.
这里更坑,将echo $p改为echo “$p”,居然结果又成了2! 综合对比一下:
结果是:
啊,原来echo $p和echo “$p”得到的结果是不一致的!加上双引号的会分行.
好,那就测试到底,看我们平时完全不在意的小习惯是否有大影响.
结果:
进一步测试发现,这个子进程其实就是在定义p的时候产生的,如果不定义p,直接ps得到进程数,则不会产生子进程
#!/bin/bash
ps -ef|grep "$0"|grep -v grep|wc -l
以上的执行过程中不会产生子进程. 结论:
- 脚本内的传参会产生子进程
- $p会将结果在一行展示,而”$p”则会分割行 以上问题只存在于脚本自己判断同名进程时会有,需要注意.