我需要找到我的操作系统(不是硬件)是 32 位/64 位。哪个命令最好?
uname -p
uname -i
uname -m
arch
所有上述命令返回相同的答案:
- 在 32 位系统上:i686/i386
- 在 64 位系统上:x86_64
答案1
我建议改为使用getconf LONG_BIT
.
[root@mymachine ~]# getconf LONG_BIT
64
这将清楚地输出32
或64
,具体取决于您安装的内核,而uname -m
( 等) 指示底层硬件名称。
另请参阅堆栈溢出问题如何确定给定的 Linux 是 32 位还是 64 位?,但请务必阅读有用的评论。
答案2
你正在为未来的问题做好准备,以这种方式提出问题。
4 年来 Unix 的智慧告诉我们,实现可移植性的最佳途径是测试特定功能,而不是整个平台。
当然,您会想到 32 位和 64 位系统之间的一些具体区别,但我向您保证,这种区别并不普遍存在。有多种 64 位。 (以及多种 32 位。)
您已经将自己限制在 Linux 上,无论是通过问题的标签,还是通过您提出问题的方式。但是,您确定您正在开发的这个脚本永远不需要在 OS X、BSD 之一、甚至“真正的”Unix 系统上运行吗?
arch
是一个特别糟糕的方法。它告诉您有关 CPU 类型的信息,而不是操作系统字长的信息,但即便如此,也可能会产生误导。例如,在 Intel 上的 OS X 下,i386
即使在 64 位系统上,它也会告诉您。它甚至不适用于所有 Linux。uname -m
并且uname -p
还告诉您有关 CPU 类型的信息,而不是操作系统的本机字大小。uname -i
不可移植,即使在 Linux 上,它也可以打印“未知”。
正确答案取决于您想知道的原因。如果是因为您正在开发需要在 64 位上执行正确操作的 C 软件,那么您需要编写一个程序来探测该行为:
#include <stdio.h>
int main() {
printf("long long = %d bits\n", sizeof(long long) * 8);
printf("long = %d bits\n", sizeof(long) * 8);
printf("void* = %d bits\n", sizeof(void*) * 8);
printf("size_t = %d bits\n", sizeof(size_t) * 8);
printf("int = %d bits\n", sizeof(int) * 8);
return 0;
}
该程序的输出将在假定共享相同本机字长的系统之间有所不同。当在相同的物理硬件上但在不同的操作系统上运行时,它甚至会有所不同。
答案3
我的应用程序仅支持 64 位版本。我需要编写一个 shell 脚本来检查操作系统架构,如果操作系统是 64 位,我的应用程序应该启动,否则应该显示验证消息。
在这种情况下,我要做的就是编写一个小型的虚拟应用程序。像这样的东西:
int main(int argc, char **argv)
{
return 0;
}
按照与主应用程序相同的方式编译和链接它。然后编写如下 shell 脚本:
#!/bin/sh
if ! ./test-platform-compatibility 2>&1 >/dev/null
then
echo I refuse to run on anything but 64-bit!
exit 1
fi
# launch your application here
这有效的作用是确保这件事您提供的可执行文件的类型能跑在用户的系统上。这类似于沃伦·杨(Warren Young)的“能力测试”建议:在本例中,您正在测试执行应用程序的二进制格式的能力。