You are facing an special behavior of "bash" combined with the ones of "pgrep".
First, we can simplify the issue using simple commands:
$ bash -c "pgrep -l -f Rahul"; echo $?
1
$ bash -c "pgrep -l -f Rahul > /dev/null"; echo $?
0
Now, we can see the internals of each one:
$ strace -tt -F bash -c "pgrep -l -f Rahul" 2>&1 | egrep "exec|clone|dup|write"
19:47:50.336043 execve("/bin/bash", ["bash", "-c", "pgrep -l -f Rahul"], [/* 55 vars */]) = 0
19:47:50.343015 execve("/usr/bin/pgrep", ["pgrep", "-l", "-f", "Rahul"], [/* 54 vars */]) = 0
19:47:50.353342 read(4, "Name:\twriteback\nState:\tS (sleepi"..., 1024) = 538
19:47:50.387157 read(4, "egrep\0exec|clone|dup|write\0", 2047) = 27
19:47:50.387668 write(1, "3031 strace\n", 123031 strace
compared with:
$ strace -tt -F bash -c "pgrep -l -f Rahul > /dev/null" 2>&1 | egrep "exec|clone|dup|write"
19:48:44.669747 execve("/bin/bash", ["bash", "-c", "pgrep -l -f Rahul > /dev/null"], [/* 55 vars */]) = 0
19:48:44.676633 clone(Process 3046 attached
[pid 3046] 19:48:44.677336 dup2(3, 1) = 1
[pid 3046] 19:48:44.677435 execve("/usr/bin/pgrep", ["pgrep", "-l", "-f", "Rahul"], [/* 54 vars */]) = 0
[pid 3046] 19:48:44.687636 read(4, "Name:\twriteback\nState:\tS (sleepi"..., 1024) = 538
[pid 3046] 19:48:44.727507 read(4, "egrep\0exec|clone|dup|write\0", 2047) = 27
[pid 3046] 19:48:44.728375 write(1, "3039 strace\n3045 bash\n", 22) = 22
see that only in second one a "clone" is done. "pgrep" then is finding the shell as a matching process.