1

我写了一个小脚本,出于某种原因,我需要转义参数中传递的任何空格以使其正常工作。

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

代码:

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

4

1 回答 1

1

你的问题与"$@".

如果您向 中添加一个-l选项pgrep,您可以看到它与当前进程匹配的原因。

您正在运行的脚本还包括您尝试在其自己的 arguments 中搜索的内容

就像这样做,并看到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.

于 2012-04-04T01:25:26.310 回答