Here is a test:
$ bash -c "pgrep -f novalidname"
$ sh -c "pgrep -f novalidname"
11202
Why is pgrep
giving output when run from sh
? (As far as I can see, there are no processes on my computer that is named novalidname
)
It's probably a timing issue and pgrep
finds itself, as you're issuing it with -f
and novalidname
is present in the command line. Try with -l
to confirm.
The actual explanation:
Regardless of flags, pgrep
never returns its own PID.
If you execute bash -c
with a simple command, then bash will exec
the command rather than creating a redundant subshell to execute it in. Consequently, bash -c "pgrep -f blah"
will replace the bash
process with a pgrep
process. If that pgrep
process is the only process whose command line includes blah
, then pgrep
will not display any PIDs (as per 1).
dash
does not perform the above optimization. (zsh
and ksh
do.) So if on your system, sh
is implemented with dash
, then sh -c "pgrep -f blah"
will result in two processes being executed -- the sh
process and the pgrep
child -- both of which contain blah
in their command lines. pgrep
will not report itself, but it will report its parent.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With