2012-04-03 68 views
1

我寫了一個小腳本,出於某種原因,我需要將參數中傳遞的任何空格轉義出來以使其起作用。pgrep打印與預期不同的pid

我閱讀了許多關於這個問題的人的其他文章,它通常是由於沒有引用$ @,但我的所有變量都在腳本中引用,並在命令行中引用了參數。另外,如果我以調試模式運行腳本,返回的行可以通過複製粘貼成功運行,但在腳本內執行時會失敗。

CODE:

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

例:

bash test.sh "blah blah"

失敗,而是返回當前運行的外殼

bash test.sh "blah\ blah"

成功的PID和返回的PID proc ess您正在通過pgrep搜索

+0

這完全不是你的問題,但我不太明白你在這裏使用'「$ @」'。 'connections'似乎被設計得很清楚,只有一個參數,如果它接收到多個參數(它將所有這些參數分別傳遞給'pgrep -nf',使得第一個參數與命令匹配行和所有後續參數僅與進程名稱匹配)。那麼爲什麼不使用'「$ 1」'而不是?或者,更好的是,如果有多個參數,會給出某種錯誤或警告? – ruakh 2012-04-03 22:13:53

+0

我已經嘗試過,並有相同的問題。如果我用$ 1替換$ @的所有實例,則會遇到同樣的問題(跳過空間工作,而不是轉義空間拉動當前shell的pid) – 2012-04-03 22:25:11

+0

是的:正如我所說的,您濫用''$ @''不是問題。但我仍然沒有看到*你爲什麼要濫用它。 – ruakh 2012-04-03 23:50:21

回答

1

您的問題與"[email protected]"無關。

如果添加-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