Makefile은 패턴을 사용하여 파일을 반복합니다.

Makefile은 패턴을 사용하여 파일을 반복합니다.

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

이것은 ibash 변수 LIST이지만 GNUMake 변수입니다.

요컨대, 달러 기호를 받기 위해 bash가 필요한 경우 makefile에 $이중 달러 기호를 추가하십시오 . $$( {}또는 을 사용하는 ()것은Makefile 또는 bash의 이에 상응하는 항목.)

답변2

{...}는 bash 구성이며 Makefile은 일반적으로 중괄호 확장 기능을 지원하지 않는 sh를 시작한다는 점을 인식해야 합니다.

그러나 모든 것이 손실되지는 않습니다. GNU Make를 사용하는 경우 SHELL := bashMakefile의 맨 위에 이 작은 줄을 넣어서 Make에게 bash를 사용하도록 지시할 수 있습니다.

관련 정보