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

blu*_*oon 12 bash makefile

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

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

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

我尝试过以下方法:

PASSWORD ?= $(shell read -s -p "Password: " pwd; echo $pwd)
Run Code Online (Sandbox Code Playgroud)

但是从不打印提示.我也试过echo "Password: "内壳,但也没打印.

有任何想法吗?

编辑:

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

PASSWORD := 

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

my-target:
    # rules for mytarget that use $(PASSWORD)
Run Code Online (Sandbox Code Playgroud)

编辑2:

我发现了这个问题.当我设置PASSWORD :=在脚本的顶部时,它设置PASSWORD为一个空字符串,这反过来导致?=跳过(因为PASSWORD)已经设置.

Dig*_*uma 23

有几件事:

  • $解引用shell变量pwd正在被解释make.你可以用make来逃避它$$
  • make正在调用shell作为Posix兼容/bin/sh而不是/bin/bash.因此,不支持-s选项read.

试试这个:

PASSWORD ?= $(shell bash -c 'read -s -p "Password: " pwd; echo $$pwd')
Run Code Online (Sandbox Code Playgroud)

这对我来说在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,并暂时抑制回声sh:

PASSWORD ?= $(shell stty -echo; read -p "Password: " pwd; stty echo; echo $$pwd)
Run Code Online (Sandbox Code Playgroud)