bash: grep 命令替换
bash: pgrep in a commad substition
我想构建一个小脚本(称为 check_process.sh
)来检查某个进程 $PROC_NAME
是否为 运行ning。如果是,它 returns 它的 PID 或 -1 否则。
我的想法是在命令替换中使用 pgrep -f <STRING>
。
如果我直接在命令行中运行这段代码:
export ARG1=foo_name
export RES=$(pgrep -f ${ARG1})
if [[ $RES == "" ]]; then echo "-1" ; else echo "$RES"; fi
一切顺利:PID
或 -1,具体取决于进程状态。
我的脚本 check_process.sh
包含相同的行加上一个额外的变量来传递进程的名称:
#!/bin/bash
export ARG1=
export RES=$(pgrep -f ${ARG1})
if [[ $RES == "" ]]; then echo "-1" ; else echo "$RES"; fi
但是这段代码不起作用!
如果进程当前 运行ning 我得到 two PID
s (进程的 PID 和 其他东西 .. .), 而当我检查一个不是 运行ning 的进程时,我得到 其他的东西 !
我很纳闷。任何的想法?
提前致谢!
如果在脚本中将 -a
标志添加到 pgrep
,您可以看到类似的内容(我 运行 ./check_process.sh vlc
):
17295 /usr/bin/vlc --started-from-file ~/test.mkv
18252 /bin/bash ./check_process.sh vlc
所以“其他东西”是 运行 脚本本身的 pid
。
pgrep
手册解释了 -f
标志:
The pattern is normally only matched against the process name. When -f is set, the full command line is used.
显然,脚本命令行包含查找进程名称 ('vlc'
) 作为参数,因此它出现在 pgrep -f
结果中。
如果您只是寻找进程名称匹配,您可以删除 -f
标志并获得您想要的结果。
如果您希望保留 -f
标志,您可以过滤掉当前的 pid
:
#!/bin/bash
ARG1=
TMP=$(pgrep -f ${ARG1})
RES=$(echo "${TMP}" | grep -v $$)
if [[ $RES == "" ]]; then echo "-1" ; else echo "${RES}"; fi
我想构建一个小脚本(称为 check_process.sh
)来检查某个进程 $PROC_NAME
是否为 运行ning。如果是,它 returns 它的 PID 或 -1 否则。
我的想法是在命令替换中使用 pgrep -f <STRING>
。
如果我直接在命令行中运行这段代码:
export ARG1=foo_name
export RES=$(pgrep -f ${ARG1})
if [[ $RES == "" ]]; then echo "-1" ; else echo "$RES"; fi
一切顺利:PID
或 -1,具体取决于进程状态。
我的脚本 check_process.sh
包含相同的行加上一个额外的变量来传递进程的名称:
#!/bin/bash
export ARG1=
export RES=$(pgrep -f ${ARG1})
if [[ $RES == "" ]]; then echo "-1" ; else echo "$RES"; fi
但是这段代码不起作用!
如果进程当前 运行ning 我得到 two PID
s (进程的 PID 和 其他东西 .. .), 而当我检查一个不是 运行ning 的进程时,我得到 其他的东西 !
我很纳闷。任何的想法? 提前致谢!
如果在脚本中将 -a
标志添加到 pgrep
,您可以看到类似的内容(我 运行 ./check_process.sh vlc
):
17295 /usr/bin/vlc --started-from-file ~/test.mkv
18252 /bin/bash ./check_process.sh vlc
所以“其他东西”是 运行 脚本本身的 pid
。
pgrep
手册解释了 -f
标志:
The pattern is normally only matched against the process name. When -f is set, the full command line is used.
显然,脚本命令行包含查找进程名称 ('vlc'
) 作为参数,因此它出现在 pgrep -f
结果中。
如果您只是寻找进程名称匹配,您可以删除 -f
标志并获得您想要的结果。
如果您希望保留 -f
标志,您可以过滤掉当前的 pid
:
#!/bin/bash
ARG1=
TMP=$(pgrep -f ${ARG1})
RES=$(echo "${TMP}" | grep -v $$)
if [[ $RES == "" ]]; then echo "-1" ; else echo "${RES}"; fi