微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – Bash脚本错误地计算自己的实例

我创建了一个bash脚本来计算自身的已启动实例.

这是(在这个例子中,我显示实例而不是用wc -l计算它们):

#!/bin/bash
nb=`ps -aux | grep count_itself.sh`
echo "$nb"
sleep 20

(当然,我的脚本名为count_itself.sh)

在执行它时,我希望它返回两行,但它返回三行:

root@myserver:/# ./count_itself.sh
root    16225   0.0 0.0 12400   1176 pts/0  S+  11:46   0:00    /bin/bash ./count_itself.sh
root    16226   0.0 0.0 12408   564 pts/0   S+  11:46   0:00    /bin/bash ./count_itself.sh
root    16228   0.0 0.0 11740   932 pts/0   S+  11:46   0:00    grep count_itself.sh

用&执行它标志(即在后台,并手动执行ps -aux位,它返回两个,这就是我想要的:

root@myserver:/# ./count_itself.sh &
[1] 16233
root@myserver:/# ps -aux | grep count_itself.sh
root     16233  0.0  0.0  12408  1380 pts/0    S    11:48   0:00 /bin/bash ./count_itself.sh
root     16240  0.0  0.0  11740   944 pts/0    S+   11:48   0:00 grep --color=auto count_itself.sh

我的问题是:为什么脚本中的ps -aux执行返回的行多于预期?

或者,换句话说,为什么在我的第一个例子中创建了id为16226的进程?

编辑(因为大多数人似乎误解了我的问题):

我想知道为什么bash执行返回/ bin / bash ./count_itself.sh的两个实例,而不是为什么它返回grep count_itself.sh.

编辑2:

当然,我正在寻找一种方法来避免这种行为,并让脚本只返回/ bin / bash ./count_itself.sh一次.

解决方法

这是greping ps输出的标准问题.

一种解决方案是在角色周围添加一些方括号

nb=$(ps -aux | grep '[c]ount_itself.sh')

这意味着您的grep实例与自身不匹配,因为带有参数的进程名称包含方括号,但它匹配的模式不包含.

评论中所述,您应该在变量周围使用双引号以保留空格.

您在结果中看起来有两个相同shell实例的原因是命令替换是在子shell中执行的.有关仅显示父进程的详细信息,请参阅this question.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐