如何让`make`提示用户输入密码并将其存储在Makefile变量中?

时间:2013-12-19 00:45:45

标签: bash makefile

我正在编写Makefile,并且makefile运行的一些命令需要密码。我想让用户能够使用make PASSWORD=password将其作为Makefile变量传递,或者如果用户没有将其传入,则提示用户输入并将其响应存储在所述Makefile变量中。

目前,我能够检查Makefile变量,然后作为目标特定规则的一部分,编写shell命令,提示用户输入密码并将其存储在shell变量中。但是,此变量仅适用于该特定shell,而不适用于任何其他shell。

如何从用户那里读取内容并将其存储在变量中?

我尝试了以下内容:

PASSWORD ?= $(shell read -s -p "Password: " pwd; echo $pwd)

但是从不打印提示。我也在shell中尝试了echo "Password: ",但也没有打印出来。

有什么想法吗?

修改

为了澄清,需要为特定目标设置密码,所以我有这样的事情:

PASSWORD := 

my-target: PASSWORD ?= $(shell read -s -p "Password: " pwd; echo $$pwd)

my-target:
    # rules for mytarget that use $(PASSWORD)

编辑2:

我发现了问题。当我在脚本顶部设置PASSWORD :=时,会将PASSWORD设置为空字符串,这会导致?=被跳过(因为PASSWORD)是已经设定。

2 个答案:

答案 0 :(得分:19)

有几件事:

  • 解除引用shell变量$的{​​{1}}正由pwd解释。您可以使用make
  • 将其从制作中删除
  • $$正在调用shell作为Posix兼容make而不是/bin/sh。因此,不支持/bin/bash -s选项。

请改为尝试:

read

这对我来说在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 PASSWORD ?= $(shell bash -c 'read -s -p "Password: " pwd; echo $$pwd') 代替sh,并暂时使用bash抑制回声:

stty

答案 1 :(得分:2)

要回答@joeb的question

$ make; echo "---Makefile---"; cat Makefile
Password: <hidden>
test
test
---Makefile---
all: first second
PASSWORD ?= $(shell read -s -p "Password: " pass; echo $$pass)
define formatted
first:
        @echo $1
second:
        @echo $1
endef

$(eval $(call formatted,$(PASSWORD)))