make 함수에서 쉘 변수를 사용할 수 없습니다.
make가 작동하는 방식을 고려하십시오. 레서피 명령을 실행할 때 먼저 명령의 모든 make 변수와 함수를 확장 한 다음 결과 문자열을 가져 와서 쉘에 전달하여 실행합니다. 쉘을 종료하십시오. 쉘이 성공 코드 (0)로 끝나면 make는 "yay it worked!"라고 말합니다. 쉘이 실패 코드 (0이 아닌)로 종료되면 make는 "실패했습니다."라고 말합니다.
for list in $(CFG_DIR); do \
echo "list is $$list"; \
for file in $(shell ls $${list}); do \
echo "file is $$file"; \
done \
done
그래서, FIRST make가 모든 변수와 함수를 포함하여이 확장됩니다 :
여기 레시피입니다. $(CFG_DIR)
변수와 $(shell...)
함수가 있습니다. 변수는 간단히 /media/test/
입니다. make가 함수를 확장 할 때 쉘에 전달할 명령이 ls ${list}
이라고 봅니다. 그래서 실행합니다
/bin/sh -c 'ls ${list}'
글쎄, 당신은 쉘이 ls
을 실행하고 현재 디렉토리의 모든 내용을 반환 그래서 어딘가에는 빈 문자열,의 사용자 환경에서 쉘 변수 list
를 설정하지 않았다면. 그런 다음이를 제조법으로 대체하고 실행 결과를 쉘로 전달하여 실행하십시오.
/bin/sh -c 'for list in /media/test; do
echo "list is $list";
for file in <current-wd-files>; do
echo "file is $file";
done
done'
So. 이야기의 도덕 : 요리법 명령에서 너는 이미 쉘 안에이다. 따라서 은을 사용하여 $(shell ...)
메이크 기능을 사용해야합니다. 혼란과 슬픔으로 만 이어질 것입니다.
이미 쉘이 있기 때문에 당신은 쉘 구문을 사용한다 :
all:
for list in $(CFG_DIR); do \
echo "list is $$list"; \
for file in `ls $${list}`; do \
echo "file is $$file"; \
done \
done
이 [이전에 몇 시간의 질문]과 동일한 것으로 보인다을 (https://stackoverflow.com/questions/47352145/ 중첩 된 for-loop-not-working-in-makefile). – Beta