unix 无法在Makefile中分配变量

bvuwiixz  于 2022-11-04  发布在  Unix
关注(0)|答案(1)|浏览(197)

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 ;
vwhgwdsa

vwhgwdsa1#

正确的解决方案是:

while read -r CURRENT_LINE; do \
                LINE="$${CURRENT_LINE}" ;
                echo "LINE:$${LINE}"; \
        done

您需要区分make变量和bash变量,并了解make在将字符串传递给shell之前扩展make变量。

echo "$$CURRENT_LINE" ; \ ##WORKING FINE, display line by line
                LINE=$(shell echo "$$CURRENT_LINE") ; \ ##NOT WORKING
                echo "line:-$(LINE)" ; \ ##empty

这有两个错误:首先,您正在运行$(shell...),它在make解析方法时启动一个新的shell...(请注意,这是在配方运行 * 之前 *,因此是在设置CURRENT_LINE之前),因此在这个shell示例中,$CURRENT_LINE将扩展为空。它也在make解析时扩展为 makeLINE变量的值。您需要使用$$LINE,make会在将其传递给shell之前扩展为$LINE,然后shell将能够扩展为它的值$LINE
对于下一部分:

LINE=$$(CURRENT_LINE) ; \ ##NOT WORKING
                echo "line:-$(LINE)" ; \ ##empty

第一行应该是LINE=$$CURRENT_LINELINE=$${CURRENT_LINE}。Bash将$(...)中的项视为命令,而不是变量。这也有第二个错误,即echo行echo的$(LINE)再次是一个 make 变量,它是空的。

y=$(subst :, ,$$CURRENT_LINE) ; \ ##NOT WORKING
                echo "y:- $(y)"; \  ##empty

所以这也是一个顺序问题--$(subst ...)在make解析时被扩展(在配方被传递到shell之前)。它所做的是替换字符串$CURRENT_LINE,而不是这个的扩展版本。而且,你再次打印了$(y)的make版本。

相关问题