pgrep打印出不同于预期的pid

时间:2012-04-03 21:50:12

标签: bash grep command-substitution

我写了一个小脚本,由于某种原因,我需要转义传入参数的任何空格才能使它工作。

我阅读了很多关于此问题的人的其他文章,这通常是由于没有引用$ @,但我在脚本中引用了所有变量,并且在命令行中引用了参数。此外,如果我在调试模式下运行脚本,则返回的行可以通过复制粘贴成功运行,但在脚本中执行时会失败。

CODE:

connections ()
{
    args="$@"
    pid="$(pgrep -nf "$args")"
    echo $pid
    # code that shows TCP and UDP connections for $pid
}
connections "$@"

实施例

bash test.sh "blah blah"

失败,而是返回当前正在运行的shell的pid

bash test.sh "blah\ blah"

成功并返回您正在通过pgrep搜索的进程的pid

1 个答案:

答案 0 :(得分:1)

您的问题与"$@"无关。

如果您向-l添加pgrep选项,则可以看到为什么与当前流程匹配。

您正在运行的脚本还包含您尝试在自己的参数中搜索的内容

就像这样做,看到grep

$ ps -U $USER -o pid,cmd | grep gnome-terminal
12410 grep gnome-terminal
26622 gnome-terminal --geometry=180x65+135+0

反斜杠产生影响的原因是什么? pgrep认为反斜杠+空间只是意味着空间。它找不到您的脚本,因为它包含blah\ blah,而不是blah blah