Невозможно записать код завершения команды в make-файле - PullRequest
2 голосов
/ 11 июля 2019

Я пытаюсь настроить мой первый make-файл и нажимаю блок на шаге 1. В моем сценарии оболочки я сделал это:

which brew | grep 'brew not found' >/dev/null 2>&1
if [ $? == 0 ]; then
    xcode-select --install
    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
fi

Это прекрасно работало как скрипт bash. После некоторого поиска в файле Makefile я до сих пор придумал одну команду:

BREW_INSTALLED = $(shell which brew | grep 'brew not found' >/dev/null 2>&1; echo $$?)

Тем не менее, запуск его получает меня

make: BREW_INSTALLED: No such file or directory

В равной степени я не уверен, когда мне нужно добавить @ к команде (похоже, что-то, что я не хочу выводить?).

Я сейчас на GNU Make 3.81.

Ответы [ 2 ]

4 голосов
/ 11 июля 2019

В этой строке есть несколько шансов:

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 $$?)
4 голосов
/ 11 июля 2019

Типичный make-файл проверяет наличие необходимых инструментов, таких как:

BREW := $(shell which brew)

# Check if variable brew is empty
ifeq ($(BREW),)
    $(error brew not found)
else
    $(info brew found: $(BREW))
endif


all:
    @echo "Do something with brew"
    $(BREW) --version

Примечание: в первых двух строках с отступом не должно быть табуляций.Две строки Recipe , если all Правило должны иметь отступы с табуляцией.


@ в началерецепт подавляет эхо: https://www.gnu.org/software/make/manual/html_node/Echoing.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...