[英]Target specific variable - command not found error - makefile
參考文檔,在下面寫了目標特定變量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)
以便 make 知道它是一個變量引用而不是一個字符串。
但是在食譜中使用$(shell...)
是多余且令人困惑的,因為食譜已經是一個 shell 腳本。
另外,您根本不清楚您真正想做什么。 您是否嘗試在本地系統上運行ls
命令? 或者你想在某個遠程系統上的某個地方運行它?
您想對aws ecr get-login... | sed...
的輸出做什么? 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}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.