Как предотвратить запуск команды $ (команда shell) слишком рано

Я хочу создать файл во время правила make-файла. В конце правила я хочу запустить команду оболочки для файла, используя функцию make $(shell xxx) .

Это упрощенный пример make-файла для демонстрации проблемы:

test:
        @echo 123 >> file
        @cat file
        @echo "File: $(shell cat file) "

Я ожидал, что будет напечатана последняя строка make-файла: File: 123

Вместо этого похоже, что make запускает $(shell cat file) перед другими строками make-файла:

> rm file
> make test
cat: file: No such file or directory
123
File:  

Есть ли какой-нибудь простой способ предотвратить нежелательное поведение и получить следующий вид результата?

> rm file
> make test
123
File: 123 

Всего 3 ответа


Здесь нет необходимости использовать синтаксис make ' $(shell ... . Просто используйте последовательность `...` `для прямого вызова cat ...

test:
        @echo 123 >> file
        @cat file
        @echo "File: "`cat file`

Или, если ваша версия echo поддерживает опцию подавления завершающей строки ...

test:
        @echo 123 >> file
        @cat file
        @echo -n "File: "; cat file

Есть ли какой-то простой способ предотвратить нежелательное поведение

Это ожидаемое и документированное поведение. Если это не то, что вы хотите, вы не должны использовать $(shell) вообще.

test:
    @echo 123 >> file
    @cat file
    @printf "File: "
    @cat file

Уберите свои доллары в Makefile и используйте собственный инструмент подпроцесса оболочки, $(command) .

test:
    echo "zzz" > z
    echo "$$(cat z)"

Есть идеи?

10000