В этой строке есть несколько шансов:
BREW_INSTALLED = $(shell which brew | grep 'brew not found' >/dev/null 2>&1; echo $$?)
В случае успеха , который записывает свой вывод в stdout, в случае сбоя в stderr.Вы пытаетесь перехватить сообщение об ошибке на стандартный вывод.
Чтобы передать стандартный вывод , который на grep , вам нужно написать
which brew 2>&1 >/dev/null | grep 'brew not found'
(порядок 2>&1
и >
также имеет значение).
Но вы не должны полагаться на конкретное сообщение об ошибке , которое .
Но вы уже получаете требуемый код возврата от , который , поэтому вам вообще не нужен grep.
, который возвращает количество ошибочных аргументов, или -1, когдаимя программы не было задано.https://linux.die.net/man/1/which
Попробуйте использовать grep -q 'expression'
для подавления вывода вместо перенаправления stdout и stderr.
-q, --quiet, --silent
Тихо;не пишите ничего в стандартный вывод.Выйдите немедленно с нулевым статусом, если найдено какое-либо совпадение, даже если обнаружена ошибка.https://linux.die.net/man/1/grep
И сообщение об ошибке, которое вы получаете, не имеет ничего общего с тем, что я пишу выше.Это означает, что оболочка пытается выполнить BREW_INSTALLED как команду, что, вероятно, означает, что make помещает ее в начало новой оболочки.Может быть, вы написали это после табуляции?см. https://www.gnu.org/software/make/manual/html_node/Recipe-Syntax.html
Чтобы получить код возврата (в виде строки!):
BREW_INSTALLED := $(shell which brew >/dev/null 2>&1; echo $$?)