2014-01-15 1 views
0

Для одного из моих проектов я использую Makefile для выполнения некоторых задач. Но по какой-то причине система не захватывает мой ввод, или я могу что-то сделать неправильно. Вот мой код:CENTOS - Linux - Make - Makefile (Get User Input не работает)

@read -e -p "Please enter email-addresses: " -i "[email protected],[email protected]" EMAIL_ADDRESSES 
@echo $EMAIL_ADDRESSES; 
@echo $$EMAIL_ADDRESSES; 
@echo ${EMAIL_ADDRESSES}; 
@echo $${EMAIL_ADDRESSES}; 

Но вот мой результат:

MAIL_ADDRESSES 
[Blank] 
[Blank] 
[Blank] 

Что я делаю неправильно? Как это исправить?

ответ

2

Во-первых, всегда используйте свои рецепты в /bin/sh, а не /bin/bash. Некоторые из возможностей, которые вы используете здесь для read, специфичны для Bash и недоступны в стандартных оболочках POSIX.

Во-вторых, make запускает каждую отдельную линию в рецепте в другой оболочке. Поэтому любые переменные оболочки, которые вы устанавливаете в одной строке, теряются, когда оболочка выходит и недоступна в следующей строке. Если вы хотите сохранить их, вы должны поместить весь сценарий на одном (логическую) строку, например:

@printf 'Please enter email-addresses: '; \ 
    read EMAIL_ADDRESSES; \ 
    echo $$EMAIL_ADDRESSES 

Если вы действительно хотите использовать Bash функции вы должны, вероятно, вызывать его непосредственно.

И, наконец, это вообще плохая идея использовать стандартный ввод из файла makefile. Если кто-то когда-либо хотел запустить ваш файл с включенными параллельными заданиями, то все, кроме одной команды, не будут иметь никакого стандартного ввода (он будет перенаправлен с /dev/null). Лучше попросить пользователя указать значение в командной строке как назначение переменной переменной.

+0

Удивительный! Добавление; \ сделал трюк! : D – roosevelt