Makefile - Почему команда чтения не читает ввод пользователя?

У меня есть следующий код внутри Makefile:

# Root Path
echo "What is the root directory of your webserver? Eg. ~/Server/htdocs" ;
read root_path ;
echo $root_path ;
if [ ! -d $root_path ] ; then \
    echo "Error: Could not find that location!" ; exit 1 ; \
fi

Однако при вводе чего-либо (например, "asd" ) это возвращается:

What is the root directory of your webserver? Eg. ~/Server/htdocs

asd
oot_path
Error: Could not find that location!

Когда я ожидал увидеть, будет:

What is the root directory of your webserver? Eg. ~/Server/htdocs

asd
asd
Error: Could not find that location!

Как это исправить?

Ответы

Ответ 1

Непосредственная проблема заключается в том, что Make сам интерпретирует $ иначе, чем оболочка. Попробуйте:

    echo "What is the root directory of your webserver? Eg. ~/Server/htdocs"; \
    read root_path; \
    echo $$root_path

Двойной $$ выходит за $ для Make, поэтому он передает одиночный $ через оболочку. Также обратите внимание, что вам нужно будет использовать продолжения строки \, чтобы вся последовательность выполнялась как одна оболочка script, иначе Make будет порождать новую оболочку для каждой строки. Это означает, что все, что вы read исчезнете, как только закончится его оболочка.

Я бы также сказал, что в общем случае приглашение для интерактивного ввода из Makefile является необычным. Возможно, вам лучше использовать переключатель командной строки, чтобы указать корневой каталог веб-сервера.

Ответ 2

Использование .ONESHELL облегчает чтение многострочных команд, а затем использование ';' и '\' для разделения строк:

.ONESHELL:
my-target:
  echo "What is the root directory of your webserver? Eg. ~/Server/htdocs"
  read root_path
  echo $$root_path

У меня недостаточно кармы, чтобы оставлять комментарии, поэтому ответ (который должен был быть комментарием к принятому ответу):