2011-06-04 3 views
2

У меня есть сценарий один строки передается в foreach функции в Makefile, как показано ниже:Для цикла в Makefile не имеет никакого эффекта

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

Что этот скрипт делает линия может быть найдена here. Я просто озадачен, почему он не работает так, потому что если я поставил линию в отдельный сценарий и вызывать его из 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, может ли кто-нибудь просветить меня? Благодарю.

ответ

0

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

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

all: 
    for F in *.txt ; do \ 
    echo $$F ; done 
+0

Я пробовал свой путь, удаляя '' 'перед' * .txt' и добавляя '$' перед двумя вхождениями переменной 'f', но он все равно не работает. – day

+0

Опубликуйте свой новый код, чтобы Нейл мог его проверить. –

+0

Я решил проблему, спасибо, что просветил меня, Нил. Это действительно недостающее '' 'вызвало проблему. – day

 Смежные вопросы

  • Нет связанных вопросов^_^