Variables 如果未定义,如何提示输入特定于目标的Makefile变量?

Variables 如果未定义,如何提示输入特定于目标的Makefile变量?,variables,makefile,Variables,Makefile,这与类似,但我只希望make在运行特定目标且未指定强制变量时提示输入值 当前代码: 这只会导致以下输出,而没有提示: 密码:读取:1:arg计数 @午夜[…]” 这里重要的一点是,只有在运行此目标时,并且只有在尚未定义变量时,我才需要询问。我不能使用configure脚本,因为我显然不应该在配置脚本中存储密码,而且这个目标不是标准安装过程的一部分。结果是,Makefiles没有使用Dash/Bash样式的引号,Dash的read内置需要一个变量名,不像Bash。结果代码: install c

这与类似,但我只希望
make
在运行特定目标且未指定强制变量时提示输入值

当前代码:

这只会导致以下输出,而没有提示:

密码:读取:1:arg计数
@午夜[…]”

这里重要的一点是,只有在运行此目标时,并且只有在尚未定义变量时,我才需要询问。我不能使用
configure
脚本,因为我显然不应该在配置脚本中存储密码,而且这个目标不是标准安装过程的一部分。

结果是,Makefiles没有使用Dash/Bash样式的引号,Dash的
read
内置需要一个变量名,不像Bash。结果代码:

install crontab delicious:$(delicious\u目标\u路径)
@而[-z“$$DELICIOUS_USER”];做\
阅读-r-p“Delicious用户名:”Delicious_用户\
完成&&\
而[-z“$$DELICIOUS_PASSWORD”];做\
读取-r-p“美味密码:”美味密码\
完成&&\
而[-z“$$DELICIOUS_PATH”];做\
阅读-r-p“美味备份路径:”美味路径\
完成&&\
( \
CRONTAB_NOHEADER=Y CRONTAB-l | | true\
打印文件“%s”\
“@午夜”\
“$(美味目标路径)”\
“\“$$DELICIOUS\u用户”\
“\“$$DELICIOUS\u密码”\
“\”$$DELICIOUS\u PATH\”\
printf'\n')| crontab-
结果:

$crontab-r;使安装crontab美味&&crontab-l
美味用户名:a\b c\d
美味密码:efg
备份路径:h\i
没有用于的crontab
@午夜“/usr/local/bin/export\u Delicious”“a\b c\d”“e f g”“h\i”
$DELICIOUS\u PASSWORD=foo使安装crontab DELICIOUS&&crontab-l
美味用户名:bar
美味备份路径:baz
@午夜“/usr/local/bin/export\u Delicious”“a\b c\d”“e f g”“h\i”
@午夜“/usr/local/bin/export_Delicious”“bar”“foo”“baz”
此代码:

  • 将所有输入字符视为文字,因此它可以处理空格和反斜杠
  • 避免用户在不写入任何内容的情况下按Enter键时出现问题
  • 使用环境变量(如果存在),以及
  • 无论crontab是否为空,都可以工作

l0b0的回答帮助我解决了一个类似的问题,如果用户不输入“y”,我想退出。我最终做了这样的事:

@while [ -z "$$CONTINUE" ]; do \
    read -r -p "Type anything but Y or y to exit. [y/N] " CONTINUE; \
done ; \
if [ ! $$CONTINUE == "y" ]; then \
if [ ! $$CONTINUE == "Y" ]; then \
    echo "Exiting." ; exit 1 ; \
fi \
fi

我希望这能帮助别人。在makefile中很难找到有关使用用户输入if/else的更多信息。

除非我的眼睛欺骗了我,否则只要按Enter键,while循环就会重复,而不是使用默认的
N
。您应该使用a。您还可以简化
if
语句:
if[$$CONTINUE!=“y”&[$$CONTINUE!=“y”];然后
。甚至
[$$CONTINUE=“y”]|[$$CONTINUE=“y”]| |(回显“退出”。退出1;)
@while [ -z "$$CONTINUE" ]; do \
    read -r -p "Type anything but Y or y to exit. [y/N] " CONTINUE; \
done ; \
if [ ! $$CONTINUE == "y" ]; then \
if [ ! $$CONTINUE == "Y" ]; then \
    echo "Exiting." ; exit 1 ; \
fi \
fi