我正在编写一个需要检查程序是否正在运行的 bash 脚本。该脚本使用参数 $1 来确定要查找的程序并将其传递给 pgrep 命令。
所以,在我的脚本 test.sh 中有一行:
>>> gender_to_binary = dict(m=1, male=1, f=0, female=0)
>>> [gender_to_binary[x.lower()] for x in gen if x.lower() in gender_to_binary]
[0, 1, 0, 1, 1, 0, 1, 1, 1, 0]
假设我有一个程序 mypgrm 正在运行,它的 PID 是 100。如果我运行“test.sh mypgrm”,我希望它输出 100
而是输出正在运行的 test.sh 的 PID
我可以看出脚本知道 $1 包含“mypgrm”
但是,如果我将 test.sh 中的行更改为:
pgrep -f $1
它确实输出 100 正如预期的那样。
我试过 pgrep -f "$1",但也不管用。
我错过了什么?
答案 0 :(得分:2)
发生这种情况是因为当时您的脚本也在运行它
其名称中包含 mypgrm
,如下所示:
bash ./test.sh mypgrm
因此由 pgrep -f
报告。您可以将其过滤掉,例如
那个:
pgrep -f "$1" | grep -v "^$$\$"
或者使用一个小技巧并以这样的形式传递程序的名称 pgrep 将不可见:
./test.sh '[m]ypgrm'