bash - 如何在 shell 脚本中 grep pidof bash?

标签 bash shell

我想获取 bash 的 PID,如果它在某个文本文件中(假设它是),则突出显示它。所以当我在 shell 中输入以下内容时:

grep -o $(pidof bash) test.txt

它工作得很好,并给了我想要的输出,即 bash 的 PID。 那么为什么这个脚本不起作用:

#!/bin/bash
PID=$(grep -o $(pidof bash) test.txt)
echo $PID

我只得到一些行:

grep: xxx: file or directory not found

xxx 是随机数,但通常最后一个就是我要查找的数字。

我如何实现这一目标以及为什么上述方法不起作用?

这与在脚本中调用 grep 时通过 shell 创建新进程有关吗?

谢谢。

最佳答案

我没有 pidof,所以我假设它相当于 pgrep -v,打印 PID 列表,每行一个,它们之间有一个换行符。

如果是这样,请考虑:

egrep -o "$(pgrep -v bash | tr '\n' '|')" test.txt

假设pgrep -v bash的输出是:

123
456
789

您的原始代码将执行以下操作:

egrep -o 123 456 789 test.txt

...因此,在名为 456 的文件、名为 789 的文件和名为 test.txt.


现在,与用管道符号替换该空格时发生的情况进行比较:

egrep -o "123|456|789" test.txt

...由本问题前面建议的管道执行的正是您所寻找的。 (顺便说一句,这里的引号纯粹是语法上的——也就是说,它们是供 shell 在理解事物如何解析时使用的,而不是传递给 egrep)。


也就是说,如果您要查找当前 bash 进程,请使用 $$ (表示当前 shell 的父 PID)或 $ BASH_PID(对于当前 shell 本身即使它是一个子 shell),而不是使用像 pgreppidof 这样不精确的工具.

关于bash - 如何在 shell 脚本中 grep pidof bash?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38287184/

相关文章:

linux - 用于从文件中搜索字符串并显示每小时实例数的 Shell 脚本

bash - 尝试通过 npm 永久安装...不工作

bash - 检查文件是否有给定的列数

c - 当不知道将通过管道发送多少数据时,如何从管道中读取数据?

linux - 如何为我的二进制安装生成响应文件?

linux - Shell脚本磁盘镜像分析

bash - 查找文件并添加一行

bash:while 循环内的计数器(kill 和 kill -9)

XMLStarlet:每个项目打印一行,同时使用来自父元素的数据

带有 shell 命令和变量的 c makefile