2012-04-03 1 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 귀하가 pgrep을 통해 검색하는 내용

+0

이것은 정확히 당신의 문제는 아니지만 여기서''$ @ "'의 사용법을 이해하지 못합니다. 'connections'는 하나의 인수만을 취하도록 명확하게 설계된 것처럼 보입니다. 다중 인수를 받으면 잘못 될 것입니다 (첫 번째 인수가 명령과 일치하도록'pgrep -nf'에 별도로 모든 인수를 전달합니다) 행 및 모든 후속 인수는 프로세스 이름과 만 일치합니다. 왜''$ 1 ''대신에''$ 1''을 쓰는 것이 좋을까요? 또는 여러 인자가있는 경우 오류나 경고를주는 것이 더 좋습니다. – ruakh

+0

나는 이미 그것을 시도했고 같은 문제가 있었다. 만약 $ @의 모든 인스턴스를 $ 1로 바꾸면 같은 문제가 발생합니다 (공간을 벗어남으로써 현재 쉘의 pid를 가져 오지는 않지만 공간이 작동 함) –

+0

예 : 말했듯이''$ @ '' 문제가되지 않습니다. 그러나 나는 왜 당신이 그것을 오용하고 싶어하는지 알지 못합니다. – ruakh

답변

1

귀하의 문제는 "[email protected]"과 아무런 관련이 없습니다. 당신이 pgrep-l 옵션을 추가하면는 현재 프로세스를 일치 왜

, 당신은 을 볼 수 있습니다.

실행중인 스크립트 에는 자체 인수 인에서 검색하려는 내용이 포함되어 있습니다.

그것은이 일을하고 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이 아니기 때문에 스크립트를 찾을 수 없습니다.