你没有说明“不起作用”指的是什么;在提问时,请始终非常清楚地说明您输入的命令、您得到的结果(最好是剪切并粘贴),以及为什么这不是您所期望的。
无论如何,最可能出现的情况是,您看到的行为是第一个echo显示了您期望的输出,但第二个echo没有。那是因为make
将在配方中的每个逻辑行中调用一个单独的shell。所以,for循环在一个shell中运行并设置环境变量PASSWORD
,然后该shell退出,并在新shell中运行最后一个echo
...在那里PASSWORD
不再设置。
您需要将整个命令行放在配方的单个逻辑行中:
login:
for line in $$(cat /u/z/users/cs327e/$$USER/.zinfo); do \
PASSWORD=$$line; \
echo $$PASSWORD; \
done \
&& echo $$PASSWORD
记住一件事:你说你在运行bash脚本,但make不会运行bash。无论你个人使用什么shell(想象一下如果makefiles使用用户正在使用的任何shell会造成多大混乱!),它都会运行/bin/sh
。你最好的选择是使用便携式shell语法编写配方。如果真的无法这样做,请确保在Makefile
中设置SHELL:= /bin/bash
以强制make使用bash。
ETA:
关于您的更大问题,您有很多选择。如果您能够控制zinfo文件的格式,则建议您定义其使用与定义变量的shell相同的语法。在上面的示例中,如果删除=
符号周围的空格,则如下所示:
user=csj483
database=cs495z_csj483
password=fjlID9dD923
如果你已经有一个包含变量赋值的有效的Shell脚本,你可以在你的makefile中引用这个脚本,这样你的生活就非常简单了:
login:
. /u/z/users/cs327e/$$USER/.zinfo \
&& echo user is $$user \
&& echo database is $$database \
&& echo password is $$password
如果您无法控制zinfo文件的语法,则生活会更加艰难。您可以使用eval,就像这样:
login:
while read var eq value; do \
eval $$var="$$value"; \
done < /u/z/users/cs327e/$$USER/.zinfo \
&& echo user is $$user \
&& echo database is $$database \
&& echo password is $$password
只有在 " = " 周围有空格时,此版本才能正常工作。如果您想要同时支持两种方式,也是可行的。