При добавлении нетривиальных фрагментов оболочки в рецепты изготовления нужно знать две основные вещи:
Команды в рецепте (конечно!) Выполняются по одной за раз, где команда означает «строку с префиксом табуляции в рецепте», возможно, распределенную по нескольким строкам make-файла с обратной косой чертой.
Таким образом, ваш фрагмент оболочки должен быть записан в одну (возможно, обратную косую черту) строку. Более того, он эффективно представляется оболочке в виде одной строки (обратные косые черты - не простые переводы строк, поэтому они не используются оболочкой в качестве разделителей команд), поэтому должны быть синтаксически правильными как таковые.
Переменные оболочки и переменные make представлены знаками доллара ($@
, $i
), поэтому вам необходимо скрыть переменные оболочки от make, записав их как $$i
. (Точнее, любой знак доллара, который вы хотите видеть в оболочке, должен быть экранирован от make, написав его как $$
.)
Обычно в сценарии оболочки вы пишете отдельные команды в отдельных строках, но здесь вы фактически получаете только одну строку, поэтому вместо них необходимо разделять отдельные команды оболочки точкой с запятой. Собирая все это вместе для вашего примера, получаем:
foo: bar
for i in `find $@ -name *_cu.*`; do mv $$i "$$(echo $$i|sed s/_cu//)"; done
или эквивалентно:
foo: bar
for i in `find $@ -name *_cu.*`; do \
mv $$i "$$(echo $$i|sed s/_cu//)"; \
done
Обратите внимание, что последняя, даже если она разложена на несколько строк, требует одинакового аккуратного использования точек с запятой, чтобы оболочка была счастливой.