shell - 带有 sed 抛出 *** 目标模式的 Makefile 不包含“%”。停止
问题描述
我有一个 Makefile,我需要在其中将图像名称传递给另一个脚本,但问题是,图像名称在其行中有:和 - 例如:image.name-v1:latest。根据 google make 文件具有 : in 变量会导致问题。如何在 Makefile 中解决此问题。下面是我正在尝试的示例代码,其中 IMAGE 具有 image.name-v1:latest
IMAGE2 ?= ''
.PHONY: image
image:
IMAGE2 := $(subst :,\:,$(IMAGE_R)) ## IMAGE_R is a run time variable for make target
rr/image.sh $(IMAGE2)
错误:
IMAGE2 := docker-rs\:latest ## Test Image using Image Reference
/bin/sh: 1: IMAGE2: not found
Makefile:75: recipe for target 'image' failed
make: *** [image] Error 127
外壳脚本:image.sh
#!/bin/bash
set -ex
IMAGE="$1"
echo "Image: $IMAGE"
解决方案
您可以尝试像这样转义冒号:
# Mock IMAGE with colon in name
IMAGE := test:123
# Create new variable adding an escapeing slash
IMAGE2 := $(subst :,\:,$(IMAGE))
# Use IMAGE2 from here on
$(info IMAGE $(IMAGE))
$(info IMAGE2 $(IMAGE2))
.PHONY: xyz-pp
xyz-pp: $(IMAGE2)
.PHONY: $(IMAGE2)
$(IMAGE2):
@echo "1234" > $(IMAGE2)
@ls
@rr/image.sh $(IMAGE2)
我在子文件夹中添加了一个脚本rr
:
echo "------------- SCRIPT ----------"
echo PARAM: $1
echo $(find -name "$1")
echo "------------- SCRIPT ----------"
输出:
> make
IMAGE test:123
IMAGE2 test\:123
makefile rr test:123
------------- SCRIPT ----------
PARAM: test:123
./test:123
------------- SCRIPT ----------
所以在这里我只是将“:”替换为“:”到变量 IMAGE2 中,然后使用它。
注意:我只是通过回显您的命令(因为我没有那个文件)并触摸 IMAGE2 来创建文件来测试这个
推荐阅读
- javascript - 正确的 ajax 脚本,它从数据库中获取对象列表
- android - 在 RecyclerView 中添加带有 Header 的新项目导致 ArrayIndexOutOfBoundsException
- c# - web.api 中的同步和异步方法
- javascript - 使用传单的地图未使用 javascript 显示
- ms-access - 有没有办法使用多个文件对话框来选择 VBA MS Access 中的文件?
- android - Firebase 防止在电子邮件验证之前创建帐户
- c# - 按日期时间间隔分组对象
- swift - 错误:无法调用非函数类型的值
- java - MediaPlayer 在 ListView 中选择新歌曲时停止当前歌曲
- html - 无法在 Safari 浏览器中使用 enter 提交表单