Запустите команду отложенной оболочки в Make - PullRequest
0 голосов
/ 10 декабря 2018

В моем Makefile я хочу выполнить несколько шагов как часть одной цели.Эти шаги должны выполняться последовательно, потому что они зависят друг от друга.Это упрощенный случай:

target:
    git archive --remote=some-remote master --format zip -o ./zipfile.zip
    echo "$(VARIABLE_IN_MAKE):$(shell unzip -z ./zipfilezip | tail -1)" > ./textfile
    $(shell cat ./textfile)

Проблема здесь в том, что команда оболочки - $(shell unzip -z ./zipfilezip | tail -1) выполняется, как только правило «загружено», т.е. даже до того, как zip-файл существует.Это возвращает ошибки.Команда cat также раскрывается слишком рано.

Каков правильный способ выполнить подоболочку не раньше, а только после того, как все вышеуказанные шаги завершены?Должен ли я обернуть все команды в вызове bash -c?Или связать их через &&?

1 Ответ

0 голосов
/ 10 декабря 2018

Избавьтесь от этих $(shell...).Каждая строка рецепта make уже является сценарием оболочки:

target:
    git archive --remote=some-remote master --format zip -o ./zipfile.zip
    echo "$(VARIABLE_IN_MAKE):$$(unzip -z ./zipfilezip | tail -1)" > ./textfile
    cat ./textfile

Обратите внимание, что во второй строке $$(unzip -z ./zipfilezip | tail -1) раскрывается дважды: в первый раз make перед передачей рецепта в оболочку, что приводит кдо $(unzip -z ./zipfilezip | tail -1) и во второй раз оболочкой, которая рассматривает это как подстановку команд.Вот почему $$ необходим: чтобы избежать первого расширения с помощью make.Если бы вы использовали $(unzip -z ./zipfilezip | tail -1) напрямую, make расширил бы ее как пустую строку (если у вас нет переменной make с именем unzip -z ./zipfilezip | tail -1, но это очень маловероятно).

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