в общем на выходе из программы по умолчанию есть 2 потока stdout - для всего нормального выхода и stderr для ошибок. По умолчанию они оба направлены в tty и все просто падает в консоль. Когда делаем | - то перенаправляем stdout в другую програмуу, но stderr продолжает смотретьв в tty, в итоге корректный выхоп идет в grep а все ошибки по прежнему падают в консоль