When you execute cat /proc/$$/mem the variable $$ is evaluated by by bash which inserts its own pid. It then executes cat which has a different pid. You end up with cat trying to read the memory of bash, its parent process. Since non-privileged processes can only read their own memory space this gets denied by the kernel.
Here's an example:
$ echo $$ 17823 Note that $$ evaluates to 17823. Let's see which process that is.
$ ps -ef | awk '{if ($2 == "17823") print}' bahamat 17823 17822 0 13:51 pts/0 00:00:00 -bash It's my current shell.
$ cat /proc/$$/mem cat: /proc/17823/mem: No such process Here again $$ evaluates to 17823, which is my shell. cat can't read my shell's memory space.