Почему "ps aux | grep x" дает лучшие результаты, чем "pgrep x"?

То ps aux | grep x команда дает "лучшие" результаты, чем pgrep x по сути, потому, что вам не хватает опции с последним.

Просто используйте -f вариант для pgrep для поиска по всей командной строке, а не только по имени процесса, которое является его поведением по умолчанию, например:

pgrep -f php5

В отличие от ps | grep конструкция, с помощью которой вам нужно отфильтровать grep линия или используйте приемы с шаблоном, pgrep просто не будет выбирать себя по замыслу.

Более того, если ваш шаблон появится в ps USER столбец, вы получите нежелательные процессы в выходных данных, pgrep не страдает от этого недостатка.

Если вам нужна полная информация, а не только PID, вы можете использовать:

ps wup $(pgrep -f python)

что проще и надежнее, чем

ps aux | grep python | grep -v grep

или

ps aux | grep p[y]thon