CENTOS-Linux-Make-Makefile(获取用户输入无效)

CENTOS-Linux-Make-Makefile(获取用户输入无效),makefile,centos,gnu-make,Makefile,Centos,Gnu Make,对于我的一个项目,我使用Makefile来执行一些任务。但是由于某些原因,系统没有捕获我的输入,或者我可能做错了什么。这是我的密码: @read -e -p "Please enter email-addresses: " -i "user1@domain.com,user2@domain.com" EMAIL_ADDRESSES @echo $EMAIL_ADDRESSES; @echo $$EMAIL_ADDRESSES; @echo ${EMAIL_ADDRESSES}; @echo $$

对于我的一个项目,我使用Makefile来执行一些任务。但是由于某些原因,系统没有捕获我的输入,或者我可能做错了什么。这是我的密码:

@read -e -p "Please enter email-addresses: " -i "user1@domain.com,user2@domain.com" EMAIL_ADDRESSES
@echo $EMAIL_ADDRESSES;
@echo $$EMAIL_ADDRESSES;
@echo ${EMAIL_ADDRESSES};
@echo $${EMAIL_ADDRESSES};
但这里是我的输出:

MAIL_ADDRESSES
[Blank]
[Blank]
[Blank]

我做错了什么?如何解决此问题?

首先,make始终在
/bin/sh
中运行其配方,而不是
/bin/bash
。这里用于
read
的一些功能是Bash特有的,在标准POSIX shell中不可用

其次,在不同的外壳中运行配方中的每一行。因此,当shell退出时,在一行中设置的任何shell变量都将丢失,并且在下一行中不可用。如果要保留它们,需要将整个脚本放在一行(逻辑)上,如下所示:

@printf 'Please enter email-addresses: '; \
    read EMAIL_ADDRESSES; \
    echo $$EMAIL_ADDRESSES
如果您真的想使用Bash特性,您可能应该直接调用它

最后,使用makefile中的标准输入通常是个坏主意。如果有人希望在启用并行作业的情况下运行makefile,那么除了一个命令之外,所有命令都不会有任何标准输入(它将从
/dev/null
重定向)。最好让用户在命令行上提供值作为make变量赋值