Большинство упомянутых вами инструментов вызывают функцию C isatty (), которая определяет, собирается ли соответствующий файловый дескриптор (в данном случае stdout) процесса на терминал.
Если выходные данные предназначены дляВ терминале они включают цвет, подсветку, издают звуковые сигналы или любые другие функции, которые, по их мнению, будут полезны для пользователя.Если терминала нет, они выводят необработанный текст для усвоения других инструментов.
Когда вы пишете
grep -v "Dogs" list-of-animals | less
Вызов isatty () из grep выполняется по дескриптору файла, ведущемук трубе, а не к вашему терминалу.Таким образом, он возвращает ноль, errno устанавливается в EINVAL или ENOTTY, а grep выводит необработанный текст, подходящий для меньшего.