我想提取并验证Makefile中的GO版本.

这在shell 中起作用:

% go version | read _ _ version _ && echo "A $version Z"
A go1.21.1 Z

但在Makefile中不起作用

check-golang-version:
    go version | read _ _ version _ && echo "A $$version Z"

结果是:

% make check-golang-version
go version | read _ _ version _ && echo "A $version Z"
A  Z

最终,我想要这样的支票:

check-golang-version:
    go version | read _ _ version _ && test "$$version" = "go1.21.1" || $(error "wrong go version: $$version")

推荐答案

默认情况下,make使用/bin/sh作为shell (请参见5.3.2 Choosing the Shell).

当你在一个shell 中执行命令时,shell 很可能是zsh.zsh管道的行为与大多数其他shell 程序不同.有关示例,请参见https://riptutorial.com/zsh/example/19869/pipes-and-subshells.

我建议使用go env GOVERSION来获取Go的版本,并将其赋给一个Makefile变量:

version = $(shell go env GOVERSION)

check-golang-version:
ifneq ($(version), go1.21.1)
    $(error wrong go version: $(version))
endif

Go相关问答推荐

Zitadel示例Go Webapp加密密钥

Websocket服务器实现与x/net库trowing 403

如何使用Gio设置标题栏图标

如何在 Chi Router 的受保护路由下提供静态文件(尤其是图像)?

切片的下限和上限

在golang中以JSON格式获取xwwwformurlencoded请求的嵌套键值对

如何将字节文件高效地读入int64切片?

Gorm 在自定义字符串类型上返回 scanner 错误

如何从 Asterisk Manager Interface Event 获取活动呼叫数

Golang:如何判断通过缓冲通道进行通信时生产者或消费者是否较慢?

如何使用带有方法的字符串枚举作为通用参数?

Protobuf.Any - 从 json.RawMessage 解组

无法使用 Golang 扫描文件路径

Go cmp - 如何为以 struct 为键的映射定义自定义相等性?

使用 GO 在侧 tar 文件中提取 tar 文件的最快方法

Dockerfile 问题 - 为什么找不到二进制 dlv - 没有这样的文件或目录

Golang BigInt 部门

有没有办法在 golang 中定义可索引类型?

Go 泛型是否与 LINQ to Objects 等效?

为什么在 unsafe.Sizeof() 中取消引用 nil 指针不会导致panic ?