Bash pgrep打印的pid与预期不同

Bash pgrep打印的pid与预期不同,bash,grep,command-substitution,Bash,Grep,Command Substitution,我写了一个小脚本,出于某种原因,我需要转义参数中传递的任何空格以使其工作 我读了很多关于这个问题的人的其他文章,这通常是因为没有引用$@,但我的所有变量都在脚本中引用,命令行中也引用了参数。此外,如果在调试模式下运行脚本,则返回的行可以通过复制粘贴成功运行,但在脚本中执行时失败 代码: 例如: bash test.sh“诸如此类” 失败,而是返回当前运行的shell的pid bash test.sh“诸如此类” 成功并返回通过pgrep搜索的进程的pid您的问题与“$@”无关 如果将-l选项添加

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

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

代码:

例如:

bash test.sh“诸如此类”

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

bash test.sh“诸如此类”


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

您的问题与
“$@”
无关

如果将
-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

您的问题与
“$@”
无关

如果将
-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

这确实不是您的问题,但我不太理解您在这里使用的
“$@”
<代码>连接显然被设计为只接受一个参数,如果它接收到多个参数,它将出现错误行为(因为它将把所有这些参数分别传递给
pgrep-nf
,这样第一个参数与命令行匹配,所有后续参数仅与进程名匹配)。那么为什么不直接使用
“$1”
相反?或者,更好的是,如果有多个参数,则给出某种错误或警告?我已经尝试过了,并且遇到了相同的问题。如果我将$@的所有实例替换为$1,则会遇到相同的问题(逃逸空间有效,而不逃逸空间会拉动当前shell的pid)是:正如我所说的,您误用了
“$@”
不是问题所在。但我仍然不明白你为什么要滥用它。这确实不是你的问题,但我不太理解你在这里使用“$@”。
连接显然是设计为只接受一个参数,如果它接收多个参数,就会出现错误(因为它将把所有这些参数分别传递给
pgrep-nf
,这样第一个参数与命令行匹配,所有后续参数仅与进程名匹配)。那么为什么不直接使用
“$1呢“
取而代之?或者,如果有多个参数,最好给出某种错误或警告?我已经尝试过了,并且遇到了相同的问题。如果我将$@的所有实例替换为$1,则会遇到相同的问题(转义空格有效,而不转义空格会拉动当前shell的pid)是的:正如我所说,你误用
“$@”
不是问题所在。但我仍然不明白你为什么要误用它。