不安装Go语言获取GOOS和GOARCH环境变量

不安装Go语言获取GOOS和GOARCH环境变量

在做 CI/CD、写构建脚本、或者下载 Go 编译产物时,经常需要知道当前系统的 GOOSGOARCH 值。如果机器上没有安装 Go,go env 命令自然无法使用。其实只需要两条 shell 命令,就能从系统信息中推导出这两个值。

核心命令

1
2
GOOS=$(echo $(uname -s) | tr '[:upper:]' '[:lower:]')
GOARCH=$(echo $(uname -m | sed s/aarch64/arm64/ | sed s/x86_64/amd64/ | sed s/armv7l/arm/ | sed s/i386/386/ | sed s/i686/386/) | tr '[:upper:]' '[:lower:]')

逐行拆解

GOOS:操作系统标识

1
GOOS=$(echo $(uname -s) | tr '[:upper:]' '[:lower:]')
  • uname -s 输出内核名称,如 DarwinLinuxFreeBSD
  • 外层 echo $(...) 用来规整输出、去掉多余空白(直接 uname -s | tr ... 管道也能工作,此处保留与原文一致的写法)
  • tr '[:upper:]' '[:lower:]' 全部转小写
  • Go 的 GOOS 值正是小写的内核名:darwinlinuxfreebsd
uname -s GOOS
Darwin darwin
Linux linux
FreeBSD freebsd
MINGW64_NT windows

Windows 比较特殊,Git Bash 下 uname -s 返回 MINGW64_NT-*MSYS_NT-*,转小写后是 mingw64_nt-*,不等于 windows。如果脚本需要兼容 Windows,需要额外处理:

1
2
3
4
case "$(uname -s)" in
MINGW*|MSYS*) GOOS=windows ;;
*) GOOS=$(uname -s | tr '[:upper:]' '[:lower:]') ;;
esac

GOARCH:CPU 架构标识

1
GOARCH=$(echo $(uname -m | sed s/aarch64/arm64/ | sed s/x86_64/amd64/ | sed s/armv7l/arm/ | sed s/i386/386/ | sed s/i686/386/) | tr '[:upper:]' '[:lower:]')
  • uname -m 输出机器硬件名,如 x86_64aarch64armv7l
  • sed s/aarch64/arm64/ 将 Linux/ARM64 的 aarch64 映射为 Go 的 arm64
  • sed s/x86_64/amd64/ 将 x86-64 映射为 Go 的 amd64
  • sed s/armv7l/arm/ 将 32 位 ARM 映射为 Go 的 arm
  • sed s/i386/386/sed s/i686/386/ 将 32 位 x86 映射为 Go 的 386
  • tr '[:upper:]' '[:lower:]' 兜底转小写

macOS(Apple Silicon)上 uname -m 直接返回 arm64,第一条 aarch64 → arm64 不会触发,命令仍正确;该 sed 仅在 Linux ARM64(返回 aarch64)时起作用。

uname -m GOARCH
x86_64 amd64
aarch64 arm64
armv7l arm
i386 386
i686 386

实际用途

下载 Go 二进制包

1
2
3
GOOS=$(uname -s | tr '[:upper:]' '[:lower:]')
GOARCH=$(uname -m | sed s/aarch64/arm64/ | sed s/x86_64/amd64/)
curl -fLO "https://go.dev/dl/go1.22.4.${GOOS}-${GOARCH}.tar.gz"

CI/CD 中选择构建产物

1
2
3
4
5
6
7
8
9
10
# GitHub Actions 示例
- name: Detect platform
run: |
GOOS=$(uname -s | tr '[:upper:]' '[:lower:]')
GOARCH=$(uname -m | sed s/aarch64/arm64/ | sed s/x86_64/amd64/)
echo "GOOS=$GOOS" >> $GITHUB_ENV
echo "GOARCH=$GOARCH" >> $GITHUB_ENV

- name: Download artifact
run: curl -fLO "https://example.com/myapp-${GOOS}-${GOARCH}"

判断当前架构是否为 ARM

1
2
3
4
GOARCH=$(uname -m | sed s/aarch64/arm64/ | sed s/x86_64/amd64/)
if [ "$GOARCH" = "arm64" ]; then
echo "Running on ARM64"
fi

小结

不需要安装 Go,仅靠 uname + sed + tr 就能准确推导出 GOOSGOARCH。核心就是两条 sed 替换——把操作系统和 CPU 架构的系统名映射到 Go 的命名约定。在 CI 环境、Docker 多架构构建、下载预编译包等场景下非常实用。