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
У меня недостаточно кармы, чтобы оставлять комментарии, поэтому ответ (который должен был быть комментарием к принятому ответу):