目标特定变量 - 找不到命令错误 - 生成文件
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}
引用 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}