首页 > 解决方案 > 如何使用 shell echo 命令在 GNU Makefile 目标中附加文件

问题描述

我正在尝试使用以下语法从 make 目标内部将一些文本附加到文件中

$shell(echo "module load ABC/$$(MODULE_LOAD)" >> $@/_env/local/filexyz)

但 GNU Make 4.2.1 抱怨以下内容。

/bin/sh: -c: line 21: syntax error near unexpected token echo 

总之,我希望文件 PQR/_env/local/filexyz 在最后一行包含以下文本

module load ABC/4.5.6

标签: bashshellmakefileecho

解决方案


首先,这是 make 函数的错误语法;应该$(shell ...)不是$shell(...)

其次,我假设这实际上出现在食谱中,因为您使用的是$@. 提问时请提供足够的详细信息,以便我们可以看到整个上下文,例如整个食谱而不仅仅是一行。

在编写配方时使用该函数是一种严重的反模式shell,因为配方中的每一行都已由shell 运行。这只是令人困惑,并且可能会导致使用该shell功能出现许多问题。

第三,您不想转义变量$$(MODULE_LOAD),因为这会导致 shell 运行MODULE_LOAD可能不存在的命令。

直接写就行了:

    echo "module load ABC/$(MODULE_LOAD)" >> $@/_env/local/filexyz

推荐阅读