Bash缺少$(HOME)变量

Bash缺少$(HOME)变量,bash,shell,makefile,Bash,Shell,Makefile,我已经使用Makefile编译了一个应用程序很长一段时间,没有出现任何问题。今天,我意识到我的Makefile不再工作了。经过一点调试,我很快发现$(HOME)没有定义 $echo $(HOME) -bash: HOME: command not found 我一直认为$HOME和$(HOME)可以互换使用。是否有理由将系统配置为避免使用$(HOME) 这是${HOME},而不是$(HOME) $(HOME)将扩展到HOME命令的输出。由于(可能)没有这样的命令,您将得到一条错误消息 但是,$

我已经使用
Makefile
编译了一个应用程序很长一段时间,没有出现任何问题。今天,我意识到我的
Makefile
不再工作了。经过一点调试,我很快发现
$(HOME)
没有定义

$echo $(HOME)
-bash: HOME: command not found

我一直认为
$HOME
$(HOME)
可以互换使用。是否有理由将系统配置为避免使用
$(HOME)

这是
${HOME}
,而不是
$(HOME)

$(HOME)
将扩展到
HOME
命令的输出。由于(可能)没有这样的命令,您将得到一条错误消息

但是,
$(HOME)
是Makefile中的正确语法。如果您需要调试Makefile的帮助,您需要向我们展示其中的内容——或者,更好的是,展示相同问题的小Makefile。
make
规则如下:

target:
        echo $(HOME)
运行
maketarget
时,应打印主目录的路径

在shell中,可以将
HOME
变量称为
$HOME
${HOME}
;后者可以避免相邻令牌的问题


在Makefile中,您可以使用
$(HOME)
${HOME}
,但是
$(HOME)
表单更常见。只有当变量名只有一个字符长时,才可以省略括号(但即使这样,为了清楚起见,也应该使用括号)。(没有人声称
make
是清晰直观的语法模型。)

它是
${HOME}
,而不是
$(HOME)

$(HOME)
将扩展到
HOME
命令的输出。由于(可能)没有这样的命令,您将得到一条错误消息

但是,
$(HOME)
是Makefile中的正确语法。如果您需要调试Makefile的帮助,您需要向我们展示其中的内容——或者,更好的是,展示相同问题的小Makefile。
make
规则如下:

target:
        echo $(HOME)
运行
maketarget
时,应打印主目录的路径

在shell中,可以将
HOME
变量称为
$HOME
${HOME}
;后者可以避免相邻令牌的问题


在Makefile中,您可以使用
$(HOME)
${HOME}
,但是
$(HOME)
表单更常见。只有当变量名只有一个字符长时,才可以省略括号(但即使这样,为了清楚起见,也应该使用括号)。(没有人声称,
make
是一个清晰直观的语法模型。)

这绝对应该是一个评论和投票。你应该知道better@hek2mgl:我不同意。如果你愿意,请随意投票以结束投票。@hek2mgl我实际上认为这是建设性的,一个“简单的印刷错误”是投票以结束投票的原因。在我看来,误解shell语法不是打字错误。你有没有引用你的陈述,语法错误从定义上来说是结束一个问题的理由?@KeithThompson我今天又读了一遍,我需要说的是,OP明确指向Makefile语法这一事实使得这个问题与其他明显的离题问题之间有一点区别。也许我在这里反应过度了。这绝对应该是一个评论和投票。你应该知道better@hek2mgl:我不同意。如果你愿意,请随意投票以结束投票。@hek2mgl我实际上认为这是建设性的,一个“简单的印刷错误”是投票以结束投票的原因。在我看来,误解shell语法不是打字错误。你有没有引用你的陈述,语法错误从定义上来说是结束一个问题的理由?@KeithThompson我今天又读了一遍,我需要说的是,OP明确指向Makefile语法这一事实使得这个问题与其他明显的离题问题之间有一点区别。可能我在这里反应过度了。Make和Bash使用不同的语法。在另一个中运行代码不是一个好主意。Make和Bash使用不同的语法。在另一个中运行一个的代码不是一个好主意。