引用文档,写在下面 目标特定变量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知道的命令,因此它会给您错误"找不到命令"。 尝试在 shell 提示符下键入字符串LOGIN_COMMAND
:这是一回事。
大概你的意思是变量LOGIN_COMMAND
的内容。 为此,您需要将其编写为$(LOGIN_COMMAND)
以便知道它是一个变量引用而不是字符串。
但是在配方中使用$(shell ...)
是多余的和令人困惑的,因为配方已经是一个 shell 脚本。
另外,你根本不清楚你真正想做什么。 您是否正在尝试在本地系统上运行ls
命令? 或者您是否正在尝试在某处的某个远程系统上运行它?
您想如何处理aws ecr get-login ... | sed ...
操作的输出?
在尝试编写生成文件之前,请确保可以在 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}