For a general solution surviving not just embedded blanks, check the recent thread on use variables of system and my reply on secure use here.</p.
Then again, you can just move the grep to perl, which takes also care of
the issue and allows more powerful regexes. A perl -e "one-liner" example would be e.g.
perl -e '$module=$ARGV[0];
@ps=`ps -eaf`;
shift @ps if $ps[0]=~/^UID|^USER/;
@ps=grep {/$module/} @ps;
$pid=+(split / +/, $ps[0])[1];
warn "pid: $pid";
warn "multiple matches" if $#ps>0; warn @ps' urxvt
Wasn't there a module to abstract from or at least parse ps: the ps output if rather inconsistent when comparing e.g. BSD vs SYSV vs GNU...? Just consider the PID field, which for me is the 2nd field.
Update: stripped the and not /grep/ from the grep, claiming shell muscle memory - ps and a lone grep in one line just feel wrong. @jwkrahn thanx for spotting it!