Короче говоря, вы не можете легко это сделать (и, скорее всего, не хотите, прокрутите вниз для обоснования). Если вы присмотритесь к своему Makefile
, то заметите, что вы смешиваете make
и синтаксис оболочки ... и их контексты.
В вашем случае буквально передается следующая строка shell (значение SHELL
, вероятно, по умолчанию /bin/sh
) с -c
:
read -p "Enter : " enter; \
hi := enter; \
echo ILE
, которое показывает эффекты смешанного синтаксиса. $(FILE)
(значение hi
) и $F
(unset -> empty) - переменные make, заменяемые make перед вызовом shell. (в то время как переменная read
в enter
вообще не используется, и вместо этого используется литеральная строка enter
при попытке назначения переменной внутри этой запущенной оболочки.)
Если вы хотите запустить команду оболочки и присвоить значение из того, что он сделал / выучил, переменной make, вы должны будете сделать это, используя функцию shell
(или сгенерировать (временный) файл, который вы бы include
, но это даже сложнее):
FILE := $(shell read -p "Enter: " enter ; echo $${enter})
Это, однако, всегда спрашивает ... если только вы не используете условное присвоение (?=
), и в этом случае вы уже можете выбирать из командной строки (make FILE=something
, в этот момент мы собираемся замкнуть круг) , Я, как правило, не уверен, каковы были ваши намерения, как сказать make
, когда спрашивать и когда использовать значение по умолчанию hi
.
. Это приводит меня к тому, почему это понятие кажется мне подозрительным для начала и почему предложение, сделанное @ HolyBlackCat , является превосходным способом настройки вызова make
.
Кроме того, любые пользовательские взаимодействия во время выполнения обычно нарушают автоматизацию (для этого у нас есть make
), а также сделать сборки невоспроизводимыми Так что их лучше избегать.
Другими словами, если бы вам действительно пришлось, я бы сказал, напишите interactive_make_call.sh
вокруг него для этого типа вызова:
#!/bin/bash
read -p "Enter : " enter
make FILE="${enter}" "$@"
Или даже:
#!/bin/bash
read -p "Enter : " enter
if [[ -n "${enter}" ]] ; then
make FILE="${enter}" "$@"
else
make "$@"
fi
Для возврата к значению по умолчанию FILE
из Makefile
, если вы просто нажмете , введите .