이 Makefile이 있는데 단순히 일부 변수를 설정하는 데 문제가 있습니다.
my_stage:
echo "FULL_NAME=$(FULL_NAME)"
echo "MY_NAME=$(MY_NAME)"
$(eval SOME_NAME=$(shell sh -c "echo ${FULL_NAME} | cut -d"-" -f 2"))
echo "SOME_NAME=$(SOME_NAME)"
$(eval NAME_ONLY=$(shell sh -c "echo ${SOME_NAME}-only))
echo "NAME_ONLY=$(NAME_ONLY)"
$(eval RIGHT_NAME=$(shell sh -c "echo ${SOME_NAME}-right))
$(eval NAME_APPENDED=$(shell sh -c "echo ${RIGHT_NAME}.${MY_NAME}))
echo "NAME_APPENDED=$(NAME_APPENDED)"
가장한 결과는 다음과 같습니다.
FULL_NAME=Shop-with-me
MY_NAME=Mariana
SOME_NAME=with
NAME_ONLY=with-only
NAME_APPENDED=with-right.Mariana
그러나 현재 결과는 다음과 같습니다.
FULL_NAME=Shop-with-me
MY_NAME=Mariana
SOME_NAME=with
NAME_ONLY=
NAME_APPENDED=
누군가 내가 무슨 일이 일어나고 있는지 알아내도록 도와줄 수 있나요? 내가 뭘 잘못했나요?
나는 또한 이것을 시도했지만 (성공하지 못했습니다):
my_stage:
echo "FULL_NAME=$(FULL_NAME)"
echo "MY_NAME=$(MY_NAME)"
$(eval SOME_NAME=$(shell sh -c "echo ${FULL_NAME} | cut -d"-" -f 2"))
echo "SOME_NAME=$(SOME_NAME)"
NAME_ONLY = ${SOME_NAME}-only
echo "NAME_ONLY=$(NAME_ONLY)"
RIGHT_NAME = ${SOME_NAME}-right
NAME_APPENDED = ${RIGHT_NAME}.${MY_NAME}
echo "NAME_APPENDED=$(NAME_APPENDED)"
답변1
${FOO}
명령에 중괄호(예: )를 사용하면 aa를 참조하는 것입니다.껍데기호출 쉘에 정의된 변수 make
.
$(fOO)
예를 들어 명령에서 괄호를 사용하면 make의 변수를 참조하는 것입니다.
make의 변수만 설정하므로 동일한 이름의 쉘 변수를 참조하면 분명히 null 값이 발생합니다.
그래서 $(eval NAME_ONLY=$(shell sh -c "echo $(SOME_NAME)-only))
작동해야합니다.
단순함은 $(eval NAME_ONLY = $(SOME_NAME)-only)
규칙을 따라야 합니다. 이를 위해 쉘을 호출할 필요는 없습니다.
make 사용을 고려할 수도 있습니다.텍스트 기능, 좋다 subst
.
답변2
어쩌면 .ONESHELL이 의도한 목적을 달성할 수도 있습니다.
gnu make는 기본적으로 각 레시피 라인에 대해 새 프로세스를 시작하므로 변수 설정은 다음 레시피에 전파되지 않습니다. .ONESHELL은 단일 셸 호출로 이 대상에 대한 모든 레시피를 실행하려고 시도합니다.
https://www.gnu.org/software/make/manual/make.html#One-Shell .ONESHELL: