我在使用makefile命令获取用户输入时遇到问题。我需要的是询问用户TXT文件的名称(位于./data/),然后使用该文件的路径作为我的主C程序的参数。
制作代码:
launch-app-conway: app-conway
@read -p "Enter file name: " FILENAME
FILEPATH = "./data/"
FILEPATH += FILENAME
./main-program FILEPATH
输出" FILEPATH:找不到命令"。
感谢您的帮助!
答案 0 :(得分:3)
这里有很多问题。首先,你根本不使用变量。值FILENAME
只是一个文本字符串,一个文字FILENAME
。它不是变量引用。
其次,您似乎正在尝试在makefile配方中使用make变量赋值等。 makefile配方(由TAB字符缩进的部分)传递给shell,你必须使用shell语法(例如shell中没有+=
赋值)。
第三,makefile配方中的每个逻辑行都被传递给另一个shell,shell中的变量赋值在shell退出时会丢失,所以即使变量引用是正确的并且你使用正确的shell语法来构造变量FILEPATH
,它将为空,因为它是在不同的shell中构造的。
你可以用这个做你想做的事:
launch-app-conway: app-conway
@read -p "Enter file name: " FILENAME; \
./main-program "./data/$$FILENAME"
但请注意,如果您尝试使用-j
运行此makefile,则可能无法正常运行,因为您的配方可能无法访问stdin。
答案 1 :(得分:1)
食谱的每一行都会产生一个新的shell。因此,如果在第1行中设置变量,那么在第line2行之前将忘记该变量。您可以使用\
来连接线条。同样,您似乎缺少美元符号(不确定您使用的是哪个外壳),但通常情况下,重新调整管中的单个美元符号表示生成变量,以及double用于shell变量。
你想要的是:
launch-app-conway: app-conway
@read -p "Enter file name: " FILENAME; \
FILEPATH="./data/$$FILENAME"; \
echo $$FILEPATH
(注意:如果你想从这里剪切和粘贴,请记住SI将标签转换为空格,而Makefile需要空格。)