GNU make переменная и переменная оболочки в рецепте

Меня немного смущают переменная make и переменная оболочки в рецепте.
поскольку каждая строка рецепта интерпретируется как оболочка, могу ли я выполнить назначение переменной оболочки? следующий пример:

.ONESHELL:
all:
    param="hello"
    echo $(param)

//--------------------
нет вывода...
и я знаю, что мы можем использовать eval для назначения переменной, но это выглядит как make переменная.
как я могу просто выполнить обычное назначение переменной оболочки, в которой я хочу хранить возвращаемое значение команды оболочки.
Спасибо.


person 尹慧贤    schedule 31.05.2017    source источник


Ответы (1)


$(param) расширяется с помощью GNU make. Чтобы сделать его расширенным оболочкой, выполните $${param}. Использование переменных в рецептах:

Ссылки на переменные и функции в рецептах имеют тот же синтаксис и семантику, что и ссылки в других местах make-файла. У них также одинаковые правила цитирования: если вы хотите, чтобы в вашем рецепте появился знак доллара, вы должны удвоить его («$$»). Для таких оболочек, как оболочка по умолчанию, в которых для представления переменных используются знаки доллара, важно четко понимать, является ли переменная, на которую вы хотите сослаться, переменной make (используйте один знак доллара) или переменной оболочки (используйте два знака доллара).

person Maxim Egorushkin    schedule 31.05.2017
comment
спасибо, работает. и кстати, в этом случае .ONESHELL: не работает. все: @param=привет; \ echo $${param} он может распечатать привет, если использовать .ONESHELL, ничего не выводится. - person 尹慧贤; 31.05.2017
comment
@尹慧贤 .ONESHELL работает, как я и ожидал, с вашим примером кода и $$. - person Maxim Egorushkin; 31.05.2017
comment
Еще раз спасибо, попробую. - person 尹慧贤; 31.05.2017
comment
обновление сделать с 3.8.1 на 4.1, тогда .ONESHELL работает. - person 尹慧贤; 01.06.2017