Bash에서는 다음과 같이 할 수 있습니다.
for name in sqls/*.{schema,migration}.sql; do
echo $name; # some operation on the file name
done
다음과 같이 출력됩니다.
sqls/0001.schema.sql
sqls/0002.schema.sql
sqls/0003.migration.sql
sqls/0004.schema.sql
sqls/0006.schema.sql
sqls/0007.schema.sql
그러나 동일한 루프를 Makefile에 넣으면 다음과 같습니다.
names:
for name in sqls/*.{schema,migration}.sql; do echo $name; done
출력은 다음과 같습니다.
sqls/*.{schema,migration}.sql
Makefile에서 동일한 작업을 어떻게 수행할 수 있나요?
답변1
당신이 원하는 것은 :
names:
for name in sqls/*.{schema,migration}.sql; do\
echo $${name};\ # some operation on the file name
done
설명된 대로문서, 이는 액세스 간의 차이점입니다.그누메이크그리고세게 때리다변하기 쉬운. 다음은 두 가지를 모두 사용하는 간단한 예입니다.
LIST = one two three
all:
for i in $(LIST); do \
echo $$i; \
done
이것은 i
bash 변수 LIST
이지만 GNUMake 변수입니다.
요컨대, 달러 기호를 받기 위해 bash가 필요한 경우 makefile에 $
이중 달러 기호를 추가하십시오 . $$
( {}
또는 을 사용하는 ()
것은Makefile 또는 bash의 이에 상응하는 항목.)
답변2
{...}는 bash 구성이며 Makefile은 일반적으로 중괄호 확장 기능을 지원하지 않는 sh를 시작한다는 점을 인식해야 합니다.
그러나 모든 것이 손실되지는 않습니다. GNU Make를 사용하는 경우 SHELL := bash
Makefile의 맨 위에 이 작은 줄을 넣어서 Make에게 bash를 사용하도록 지시할 수 있습니다.