试图找到最便携的方法来确定系统的 CPU 架构,无论是 32 位 x86、64 位还是其他(例如 ARM)。该命令是否arch
存在于所有系统上?否则我如何从外壳测试这个?
答案1
arch
是一个 GNU 命令。它只是 的同义词uname -m
。uname -m
是可移植的,因为它的存在是由POSIX它存在于历史上的 Unix 系统中,除了极早期的系统。
不太可移植的是输出的含义。这在 Unix 变体之间确实有所不同。
输出不会告诉您系统是 32 位还是 64 位。没有命令可以告诉您系统是 32 位还是 64 位,因为这不是一个明确定义的选项。看Linux 命令返回位数(32 或 64)?了解报告系统位数的一些方法,了解 32/64 位的几种概念。
答案2
FreeBSD 10.3 没有该arch
命令。
也许uname -m
可能更合适?即使如此,FreeBSD 输出amd64
,而 OS X El Capitan 输出x86_64
,所以你需要考虑到这一点。我没有任何 Linux 主机来测试这个......
答案3
在我的 64 位 OSX 上埃尔卡皮坦系统,arch
打印i386
。也许你不应该盲目相信它的输出。
有趣的是,
$ file /usr/bin/arch
arch: Mach-O universal binary with 2 architectures
arch (for architecture i386): Mach-O executable i386
arch (for architecture x86_64): Mach-O 64-bit executable x86_64
对于 Linux,较旧的系统没有 GNU coreutils 现在提供的版本(以及某些机器有没有arch
程序或脚本)。 2007 年添加的,引用自NEWS
:
* Noteworthy changes in release 6.9.90 (2007-12-01) [beta]
** New programs
arch: equivalent to uname -m, not installed by default
But don't install this program on Solaris systems.
之所以评论说不要在Solaris上安装,是因为Sun从20世纪80年代的SunOS开始就提供了这个实用程序。旧的手册页很难找到; SunOS 4.1.3 日期这是1992年。 AIX 和 HPUX 没有arch
程序,并且与复制到 Linux 中的其他 SunOS 功能一样,POSIX 中也没有这一功能。
如果您需要更可靠的东西,则输出config.guess
对大多数人来说效果很好:
# You can get the latest version of this script from:
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
如果您阅读该脚本,就会发现某些(较旧的)机器无法uname -m
按您的预期工作。但首先请阅读标题中的许可证,看看它如何适用于您。