Makefile - Почему команда чтения не читает ввод пользователя? - PullRequest
15 голосов
/ 19 сентября 2010

У меня есть следующий код внутри 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!

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

Ответы [ 2 ]

21 голосов
/ 19 сентября 2010

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

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

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

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

2 голосов
/ 21 июня 2019

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

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

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

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