如何在aarch64架构Linux系统中获取字符串arm64?
我的系统执行uname -a输出如下:
Linux ubuntu-arm-test 5.15.0-105-generic #115-Ubuntu SMP Mon Apr 15 09:52:04 UTC 2024 aarch64 aarch64 aarch64 GNU/Linux
我已经能用下面的脚本把aarch64转换成arm64:
#!/bin/bash # 获取硬件架构名 arch=$(uname -m) # 转换aarch64为arm64 if [ "$arch" == "aarch64" ]; then echo "arm64" else echo "$arch" fi
但想找更简便的实现方式,尝试读取/proc/sys/kernel/arch时提示文件不存在:
root@ubuntu-arm-test:~# cat /proc/sys/kernel/arch
cat: /proc/sys/kernel/arch: No such file or directory
另外我有点困惑:arm64在包名里明明很常见,怎么就没有直接获取它的方法?
几种简便实现方案
1. 一行完成字符串替换
不用写if判断,直接用Bash内置操作或sed命令搞定:
# 用sed实现 arch=$(uname -m | sed 's/aarch64/arm64/') # 纯Bash内置操作,无需外部命令 arch=$(uname -m) arch=${arch/aarch64/arm64}
2. 直接用dpkg获取包管理层面的架构名(Debian/Ubuntu专属)
既然你提到包名里常用arm64,Ubuntu这类Debian系发行版可以直接用dpkg输出标准架构名,一步到位:
arch=$(dpkg --print-architecture)
在你的aarch64系统上,这个命令会直接输出arm64,完全不需要转换。
3. 用case语句简化判断(方便扩展多架构)
如果以后要兼容更多架构,case语句比if逻辑更清晰易扩展:
case $(uname -m) in aarch64) echo arm64 ;; x86_64) echo amd64 ;; # 可兼容x86系包名架构 *) echo $(uname -m) ;; esac
关于"没有直接获取方法"的解释
uname -m输出的是内核层面的架构命名(aarch64是ARM 64位的内核标准名称),而包名里的arm64是发行版包管理体系的命名,两者属于不同的命名规范。不同发行版会有专属工具输出符合自身包管理的架构名(比如RHEL系可用rpm -E %_arch),所以没有通用的"直接获取"命令,但针对特定发行版可以用对应工具快速拿到。
内容的提问来源于stack exchange,提问作者guettli

