Как мне заставить `make` запрашивать у пользователя пароль и хранить его в переменной Makefile?
Я пишу Makefile, и некоторые из команд, которые запускают makefile, требуют пароля. Я хотел бы предоставить пользователю возможность передать это как переменную Makefile с помощью make PASSWORD=password
или если пользователь не передает ее, а затем запросит у пользователя ее и сохранит ответ в указанной переменной Makefile.
В настоящий момент я могу проверить переменную Makefile, а затем, как часть моих целевых правил, написать команды оболочки, которые запрашивают пароль пользователя и сохраняют его в переменной оболочки. Однако эта переменная доступна только для этой конкретной оболочки, а не для других.
Как я могу что-то прочитать у пользователя и сохранить его в переменной?
Я пробовал следующее:
PASSWORD ?= $(shell read -s -p "Password: " pwd; echo $pwd)
но подсказка никогда не печатается. Я также пробовал echo "Password: "
внутри оболочки, но это тоже не печатается.
Любые идеи?
Edit:
Чтобы уточнить, пароль должен быть установлен для конкретной цели, поэтому у меня есть что-то вроде этого:
PASSWORD :=
my-target: PASSWORD ?= $(shell read -s -p "Password: " pwd; echo $$pwd)
my-target:
# rules for mytarget that use $(PASSWORD)
Изменить 2:
Я нашел проблему. Когда я устанавливаю PASSWORD :=
в верхней части script, он устанавливает PASSWORD
в пустую строку, а это, в свою очередь, заставляет ?=
пропускаться (поскольку PASSWORD
) уже установлен.
Ответы
Ответ 1
Пара вещей:
- переменная
$
для разыменования оболочки pwd
интерпретируется командой make
. Вы можете избежать этого с помощью $$
-
make
вызывает оболочку как Posix-совместимый /bin/sh
вместо /bin/bash
. Таким образом, опция -s
для read
не поддерживается.
Попробуйте это вместо:
PASSWORD ?= $(shell bash -c 'read -s -p "Password: " pwd; echo $$pwd')
Это работало для меня на Ubuntu 12.04/GNU make 3.81/bash 4.2.25 (1)
А на OSX 10.8.5/make 3.81/bash 3.2.48 (1):
$ cat Makefile
PASSWORD ?= $(shell bash -c 'read -s -p "Password: " pwd; echo $$pwd')
all:
echo The password is $(PASSWORD)
$ make
Password: echo The password is 1234
The password is 1234
$
Обновление - @user5321531 указало, что мы можем использовать POSIX sh
вместо bash
и временно подавить эхо с помощью stty
:
PASSWORD ?= $(shell stty -echo; read -p "Password: " pwd; stty echo; echo $$pwd)