2016-04-20 4 views
2

Я пытаюсь писать простой Makefile, который выглядит примерно следующим образом:Shell воздаем не работает в первый раз

all: 
    mkdir -p /home/developer/data/test/ && \ 
    cp /home/developer/data/sample.txt /home/developer/data/test/ && \ 
    export FILEPATH=$(dir $(shell find /home/developer/data/test/ -type f -name sample.txt)) && \ 
    echo $$FILEPATH 

Когда я выполняю сделать первый эхо-сигнала равна нулю (то есть ничего не получить в печатном виде). Но когда я выполняю то же самое без удаления теста каталога, он напечатает правильный путь для эха.

Но как только вы снова удалите тестовую директорию и сделаете эхо-значение null.

Что я в этом делаю неправильно?

+0

Я думаю, что это должно быть '$ FILEPATH' с одним' $ ', а не с двумя' $$ ', как у вас там – Entea

+0

@Entea Это в рецепте make. Удвоенная '$$' правильная. –

ответ

2

Это вопрос времени.

Вы ожидаете, что все содержимое тела рецепта будет выполняться во время выполнения рецепта, но это не то, что происходит.

Конструкции make внутри тела рецепта выполняют первые и разворачиваются в тело рецепта, которое затем запускается оболочкой.

Так $(dir $(shell ...)) работает , прежде чем любой из команд оболочки запуска и поэтому нет ничего для find, чтобы найти в первый раз.

Не входите в и из make таких контекстов. Если вы хотите запустить команду оболочки в контексте оболочки, сделайте это.

all: 
    mkdir -p /home/developer/data/test/ && \ 
    cp /home/developer/data/sample.txt /home/developer/data/test/ && \ 
    FILEPATH=$$(dirname $$(find /home/developer/data/test/ -type f -name sample.txt)) && \ 
    echo $$FILEPATH 

Также отметим, что export не было необходимости, и ничего не делать для вас на всех.

+0

Спасибо за подробное объяснение ... Это сработало .. –