Quando você executa ps ... | grep ... , ps e grep são iniciados juntos e a saída de ps é alimentada para grep de forma assíncrona. Então, no momento em que ps varre a lista de processos e imprime a saída, o processo grep também está ativo e a saída de ps inclui esse grep processo também.
Agora, se você fizer um simples grep foo , a saída de ps conterá grep foo e grep corresponderá a esse foo :
$ ps aux | grep non-existent
muru 19042 0.0 0.0 10760 2224 pts/8 S+ 23:56 0:00 grep non-existent
Obviamente, não há processo chamado non-existent .
Em vez de ps | grep , use pgrep para uma correspondência mais clara :
pgrep foo
Ou ps em si, se você souber o nome do comando:
ps -C foo
Por que grep --color... ? Porque o Ubuntu define um apelido para grep por padrão:
$ alias grep
alias grep='grep --color=auto'
É também por isso que você vê truques idiotas como:
ps ... | grep foo | grep -v grep
ps ... | grep '[f]oo'