我想获取 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),而不是使用像 pgrep
或 pidof
这样不精确的工具.
关于bash - 如何在 shell 脚本中 grep pidof bash?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38287184/