在Makefile
中,当我将bash
变量赋给Makefile
文件时,它不起作用,赋了空字符串。在下面的代码中,变量LINE
和变量y
为空。
SHELL = bash
target:
while read -r CURRENT_LINE; do \
echo "$$CURRENT_LINE" ; \ ##WORKING FINE, display line by line
LINE=$(shell echo "$$CURRENT_LINE") ; \ ##NOT WORKING
echo "line:-$(LINE)" ; \ ##empty
LINE=$$(CURRENT_LINE) ; \ ##NOT WORKING
echo "line:-$(LINE)" ; \ ##empty
y=$(subst :, ,$$CURRENT_LINE) ; \ ##NOT WORKING
echo "y:- $(y)"; \ ##empty
done < sample_file.txt ;
1条答案
按热度按时间vwhgwdsa1#
正确的解决方案是:
您需要区分make变量和bash变量,并了解make在将字符串传递给shell之前扩展make变量。
这有两个错误:首先,您正在运行$(shell...),它在make解析方法时启动一个新的shell...(请注意,这是在配方运行 * 之前 *,因此是在设置
CURRENT_LINE
之前),因此在这个shell示例中,$CURRENT_LINE
将扩展为空。它也在make解析时扩展为 make 的LINE
变量的值。您需要使用$$LINE
,make会在将其传递给shell之前扩展为$LINE
,然后shell将能够扩展为它的值$LINE
。对于下一部分:
第一行应该是
LINE=$$CURRENT_LINE
或LINE=$${CURRENT_LINE}
。Bash将$(...)
中的项视为命令,而不是变量。这也有第二个错误,即echo行echo的$(LINE)
再次是一个 make 变量,它是空的。所以这也是一个顺序问题--
$(subst ...)
在make解析时被扩展(在配方被传递到shell之前)。它所做的是替换字符串$CURRENT_LINE
,而不是这个的扩展版本。而且,你再次打印了$(y)
的make版本。