目标特定变量 - 找不到命令错误 - 生成文件

Target specific variable - command not found error - makefile

引用 documentation,在目标特定变量下面写下 LOGIN_COMMAND

想法是仅在用户运行时分配此变量 make target1


下面Makefile:

target1 : LOGIN_COMMAND := $(shell aws ecr get-login --no-include-email | sed 's|https://||')

target1:
    $(shell LOGIN_COMMAND)
    $(shell ls)

make target1 给出以下错误:

make: LOGIN_COMMAND: Command not found

如何解决这个错误?

我不明白为什么每个人总是在食谱中使用 $(shell ...)。有什么地方推荐这个吗?它无处不在,我从未见过任何示例 makefile 可以做到这一点(这是正确的,因为这真的不是一个好主意)。

无论如何。当您添加 $(shell LOGIN_COMMAND) 时,它有什么作用?它启动一个 shell 并告诉 shell 到 运行 字符串 LOGIN_COMMAND。这不是 shell 知道的命令,所以它给你错误 "command not found"。尝试在 shell 提示符下输入字符串 LOGIN_COMMAND:结果是一样的。

大概你指的是变量LOGIN_COMMAND的内容。为此,您需要将其写为 $(LOGIN_COMMAND) 以便 make 知道它是一个变量引用而不是字符串。

但是在食谱中使用 $(shell ...) 是多余且令人困惑的,因为食谱已经是 shell 脚本。

此外,您根本不清楚您真正想做什么。您是否尝试在本地系统上执行 运行 ls 命令?或者你想 运行 它在某个远程系统的某个地方?

您想对 aws ecr get-login ... | sed ... 操作的输出做什么?

在尝试编写 makefile 之前,请确保您可以在 shell 提示符下执行您想要执行的操作。

基于,下一个可能的解决方案是:

target1:
      aws ecr get-login --no-include-email | sed 's|https://||' | sh

注意尾随 sh

另一个解决方案是创建一个临时文件,运行它:

AWSSH=output.sh
${AWSSH}:
    aws ecr get-login --no-include-email | sed 's|https://||' > $@
    chmod +x $@

target1: ${AWSSH}
    ./${AWSSH}
    rm -f ${AWSSH}