Для цикла в Makefile не имеет никакого эффекта

У меня есть однострочный сценарий, переданный в 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 ответа

Решение

Решение: добавление еще одного $ перед последовательностью, начинающейся с 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)

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

all:
    for F in *.txt ; do \
    echo $$F ; done 
Другие вопросы по тегам