Для цикла в 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