我正在编写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)
归档时间: |
|
查看次数: |
12976 次 |
最近记录: |