Для цикла в Makefile не имеет никакого эффекта - PullRequest
2 голосов
/ 04 июня 2011

У меня есть однострочный скрипт, переданный в функцию foreach в Makefile, как показано ниже:

flag:
        $(foreach f, $*.txt, printf "%s\n" 0a "$(grep -o '[0-9]\+' $f | sed 's/.*/read \"&\"/')" "" . w q | ed $f)

То, что делает эта строка скрипта, можно найти здесь . Я просто озадачен, почему это не работает таким образом, потому что, если я помещу строку в отдельный скрипт и вызову ее из Makefile следующим образом:

flag:
        $(forech f, $*.txt, ./script $f)

отлично работает.

Я также попробовал цикл оболочки for следующим образом:

flag:
        for f in $*.txt ; do \
          printf "%s\n" 0a "$(grep -o '[0-9]\+' $f | sed 's/.*/read \"&\"/')" "" . w q | ed $f ; \
        done

все еще не повезло. Я должен коснуться некоторых тонких моментов Makefiles, кто-нибудь может просветить меня? Спасибо.

Ответы [ 2 ]

7 голосов
/ 04 июня 2011

И слишком много, и недостаточно знаков $!Здесь перечислены файлы * .txt - обратите внимание на $$ F:

all:
    for F in *.txt ; do \
    echo $$F ; done 
0 голосов
/ 07 июня 2011

Решение: добавьте еще один $ перед последовательностью, начинающейся с grep,

flag:
        $(foreach f, $*.txt, printf "%s\n" 0a "$$(grep -o '[0-9]\+' $f | sed 's/.*/read \"&\"/')" "" . w q | ed $f)

, или используйте вместо этого старые обратные галочки

flag:
        $(foreach f, $*.txt, printf "%s\n" 0a "`grep -o '[0-9]\+' $f | sed 's/.*/read \"&\"/'`" "" . w q | ed $f)
...