Целевая переменная c переменная - команда не найдена ошибка - make-файл - PullRequest
0 голосов
/ 22 января 2020

Ссылаясь на документацию , записанную ниже целевой спецификацией c переменная LOGIN_COMMAND.

Идея состоит в том, чтобы назначать эту переменную только тогда, когда пользователь запускает make target1


В приведенном ниже Makefile:

target1 : LOGIN_COMMAND := $(shell aws ecr get-login --no-include-email | sed 's|https://||')

target1:
    $(shell LOGIN_COMMAND)
    $(shell ls)

make target1 выдается ошибка ниже:

make: LOGIN_COMMAND: Command not found

Как устранить эту ошибку?

Ответы [ 2 ]

3 голосов
/ 22 января 2020

Я не могу понять, почему все всегда используют $(shell ...) в рецептах. Есть ли какая-то сломанная инструкция где-то, которая рекомендует это? Это настолько вездесуще, и я никогда не видел ни одного примера make-файлов, которые бы это делали (правильно, потому что это действительно не очень хорошая идея).

В любом случае. Когда вы добавляете $(shell LOGIN_COMMAND) что это делает? Он запускает оболочку и говорит оболочке запустить строку LOGIN_COMMAND. Это не команда, которую знает оболочка, поэтому выдает ошибку «команда не найдена». Попробуйте набрать строку LOGIN_COMMAND в командной строке: это то же самое.

Предположительно, вы имели в виду содержимое переменной LOGIN_COMMAND. Для этого вам нужно записать его как $(LOGIN_COMMAND), чтобы make знал, что это ссылка на переменную, а не строка.

Но использование $(shell ...) в рецепте излишне и сбивает с толку, поскольку рецепт уже является сценарием оболочки.

Плюс не совсем понятно, что вы действительно хотите сделать. Вы пытаетесь запустить команду ls в локальной системе? Или вы пытаетесь запустить его в какой-нибудь удаленной системе где-нибудь?

Что вы хотите сделать с выводом операции aws ecr get-login ... | sed ...?

Прежде чем пытаться написать make-файл, убедитесь, что вы можете выполнять операции, которые вы хотите сделать, в командной строке.

1 голос
/ 22 января 2020

На основании вашего комментария одним из возможных решений является следующее:

target1:
      aws ecr get-login --no-include-email | sed 's|https://||' | sh

Обратите внимание на конечный sh.

Другое решение заключается в создании временного файла и запустите его:

AWSSH=output.sh
${AWSSH}:
    aws ecr get-login --no-include-email | sed 's|https://||' > $@
    chmod +x $@

target1: ${AWSSH}
    ./${AWSSH}
    rm -f ${AWSSH}
...