加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 04:57:50 所属栏目:百科 来源:网络整理
导读:这类似于 another issue,但是如果我正在运行特定目标并且尚未指定强制变量,我只希望make提示输入值. 目前的代码: install-crontab: PASSWORD ?= "$(shell read -p "Password: "; echo "$$REPLY")"install-crontab: $(SCRIPT_PATH) @echo "@midnight "$(SCR
这类似于 another issue,但是如果我正在运行特定目标并且尚未指定强制变量,我只希望make提示输入值.

目前的代码:

install-crontab: PASSWORD ?= "$(shell read -p "Password: "; echo "$$REPLY")"
install-crontab: $(SCRIPT_PATH)
    @echo "@midnight "$(SCRIPT_PATH)" [...] "$(PASSWORD)""

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

Password: read: 1: arg count
@midnight [...] ""

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

解决方法

事实证明,Makefile不使用Dash / Bash风格的引用,并且Dash的内置读取需要一个变量名,与Bash不同.结果代码:
install-crontab-delicious: $(DELICIOUS_TARGET_PATH)
    @while [ -z "$$DELICIOUS_USER" ]; do 
        read -r -p "Delicious user name: " DELICIOUS_USER;
    done && 
    while [ -z "$$DELICIOUS_PASSWORD" ]; do 
        read -r -p "Delicious password: " DELICIOUS_PASSWORD; 
    done && 
    while [ -z "$$DELICIOUS_PATH" ]; do 
        read -r -p "Delicious backup path: " DELICIOUS_PATH; 
    done && 
    ( 
        CRONTAB_NOHEADER=Y crontab -l || true; 
        printf '%s' 
            '@midnight ' 
            '"$(DELICIOUS_TARGET_PATH)" ' 
            ""$$DELICIOUS_USER" " 
            ""$$DELICIOUS_PASSWORD" " 
            ""$$DELICIOUS_PATH""; 
        printf 'n') | crontab -

结果:

$crontab -r; make install-crontab-delicious && crontab -l
Delicious user name: ab cd
Delicious password: e f g
Delicious backup path: h i
no crontab for <user>
@midnight "/usr/local/bin/export_Delicious" "ab cd" "e f g" "h i"
$DELICIOUS_PASSWORD=foo make install-crontab-delicious && crontab -l
Delicious user name: bar
Delicious backup path: baz
@midnight "/usr/local/bin/export_Delicious" "ab cd" "e f g" "h i"
@midnight "/usr/local/bin/export_Delicious" "bar" "foo" "baz"

这段代码:

>将所有输入字符视为文字,因此它适用于空格和反斜杠,>如果用户在没有写任何内容的情况下按Enter键,则可以避免>使用环境变量(如果存在),和>无论crontab是否为空,它都有效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读