Почему это занимает столько же времени? - PullRequest
0 голосов
/ 06 июля 2011

Я запускаю в make-файле следующее: -

@START=$(shell date +%s) && \
echo $${START} &&\
sleep 10s && \
END=$(shell date +%s) && \
echo "$${END} $${START}" &&\
DIFF_SUB=$$(($$END - $$START)) && \
echo IT TOOK $${DIFF_SUB} SECONDS

и выводит следующее: -

1309950228
1309950228 1309950228
ОНА УТРАЛИЛА 0 СЕКУНД

Ответы [ 2 ]

4 голосов
/ 06 июля 2011

Причина, по которой вы получаете одинаковый результат для каждого $(shell date +%s), заключается в том, что каждый выполняется и заменяется в одно и то же время - то есть, когда make запускает команду.

После makeвыполняет замены, это команда, которую видит оболочка:

@START=1309950228 && \
echo ${START} &&\
sleep 10s && \
END=1309950228 && \
echo "${END} ${START}" &&\
DIFF_SUB=$(($END - $START)) && \
echo IT TOOK ${DIFF_SUB} SECONDS

Если вы хотите, чтобы команда date выполнялась дважды с разницей во времени 10 секунд между ними, вам потребуется оболочка для выполнения командыподстановка команд, а не make:

@START=$$(date +%s) && \
echo $${START} &&\
sleep 10s && \
END=$$(date +%s) && \
echo "$${END} $${START}" &&\
DIFF_SUB=$$(($$END - $$START)) && \
echo IT TOOK $${DIFF_SUB} SECONDS

Обратите внимание на двойной $$ и удаление команды shell make.

0 голосов
/ 06 июля 2011

make раскрывает все ссылки на переменные и функции в теле правила перед выполнением любого из них. Поскольку вы используете $(shell) для запуска команды date, это фактически означает, что оба вызова date выполняются до sleep.

Имейте в виду, что тело правила уже выполнено с использованием оболочки, поэтому, как правило, в любом случае избыточно использовать $(shell) в этом контексте - просто дайте оболочке сделать свое дело, а не пытаясь заставить make сделать часть этого. См. Ответ camh для примера того, как это сделать.

Подробнее о взаимосвязи между make и оболочкой можно прочитать здесь: Команды оболочки в GNU составляют .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...