在 bash 脚本中是否可以检测到32位和64位?

我正在写一个 bash 脚本,以自动的方式处理一些安装... 我有可能得到一个这样的程序在32或64位二进制... 是否有可能检测机器架构从 bash,以便我可以选择正确的二进制?

这将用于 Ubuntu 机器。

46887 次浏览

是的

uname -a

- 有什么能用的吗?-我没有64位的机器可以测试。


来自 Mike Stone 的注释: 虽然具体来说,这是可行的

uname -m

将为64位赋予“ x86 _ 64”,为其他32位类型赋予“ x86 _ 64”(在我的32位 VM 中,它是“ i686”)。

你可以这样做:

if $(uname -a | grep 'x86_64'); then
echo "I'm 64-bit"
else
echo "I'm 32-bit"
fi
MACHINE_TYPE=`uname -m`
if [ ${MACHINE_TYPE} == 'x86_64' ]; then
# 64-bit stuff here
else
# 32-bit stuff here
fi

是的,无名氏应该可以。参见: http://www.stata.com/support/faqs/win/64bit.html

slot8(msd):/opt # uname -a
Linux slot8a 2.6.21_mvlcge500-electra #1 SMP PREEMPT Wed Jun 18 16:29:33 \
EDT 2008 ppc64 GNU/Linux


记住,除了 Intel/AMD,还有其他 CPU 架构..。

getconf LONG_BIT似乎也可以做到这一点,这使得检查这一点更加容易,因为它只返回整数,而不是一些复杂的表达式。

if [ `getconf LONG_BIT` = "64" ]
then
echo "I'm 64-bit"
else
echo "I'm 32-bit"
fi

例如,您可以使用下面的脚本(我从“ ioquake3”的官方脚本中提取这个脚本)

archs=`uname -m`
case "$archs" in
i?86) archs=i386 ;;
x86_64) archs="x86_64 i386" ;;
ppc64) archs="ppc64 ppc" ;;
esac


for arch in $archs; do
test -x ./ioquake3.$arch || continue
exec ./ioquake3.$arch "$@"
done

==================================================================================

我正在做一个脚本来检测“架构”,这是我的简单代码(我使用它与葡萄酒,为我的 Windows 游戏,在 Linux 下,每个游戏,我使用不同版本的 WineHQ,从“ PlayOnLinux”网站下载。

# First Obtain "kernel" name
KERNEL=$(uname -s)


if      [ $KERNEL = "Darwin" ]; then
KERNEL=mac
elif        [ $Nucleo = "Linux" ]; then
KERNEL=linux
elif        [ $Nucleo = "FreeBSD" ]; then
KERNEL=linux
else
echo "Unsupported OS"
fi


# Second get the right Arquitecture
ARCH=$(uname -m)


if         [ $ARCH = "i386" ]; then
PATH="$PWD/wine/$KERNEL/x86/bin:$PATH"
export WINESERVER="$PWD/wine/$KERNEL/x86/bin/wineserver"
export WINELOADER="$PWD/wine/$KERNEL/x86/bin/wine"
export WINEPREFIX="$PWD/wine/data"
export WINEDEBUG=-all:$WINEDEBUG
ARCH="32 Bits"
elif    [ $ARCH = "i486" ]; then
PATH="$PWD/wine/$KERNEL/x86/bin:$PATH"
export WINESERVER="$PWD/wine/$KERNEL/x86/bin/wineserver"
export WINELOADER="$PWD/wine/$KERNEL/x86/bin/wine"
export WINEPREFIX="$PWD/wine/data"
export WINEDEBUG=-all:$WINEDEBUG
ARCH="32 Bits"
elif    [ $ARCH = "i586" ]; then
PATH="$PWD/wine/$KERNEL/x86/bin:$PATH"
export WINESERVER="$PWD/wine/$KERNEL/x86/bin/wineserver"
export WINELOADER="$PWD/wine/$Nucleo/x86/bin/wine"
export WINEPREFIX="$PWD/wine/data"
export WINEDEBUG=-all:$WINEDEBUG
ARCH="32 Bits"
elif    [ $ARCH = "i686" ]; then
PATH="$PWD/wine/$KERNEL/x86/bin:$PATH"
export WINESERVER="$PWD/wine/$KERNEL/x86/bin/wineserver"
export WINELOADER="$PWD/wine/$KERNEL/x86/bin/wine"
export WINEPREFIX="$PWD/wine/data"
export WINEDEBUG=-all:$WINEDEBUG
ARCH="32 Bits"
elif [ $ARCH = "x86_64" ]; then
export WINESERVER="$PWD/wine/$KERNEL/x86_64/bin/wineserver"
export WINELOADER="$PWD/wine/$KERNEL/x86_64/bin/wine"
export WINEPREFIX="$PWD/wine/data"
export WINEDEBUG=-all:$WINEDEBUG
ARCH="64 Bits"
else
echo "Unsoportted Architecture"
fi

==================================================================================

现在我在 bash 脚本中使用它,因为它在任何发行版中都能更好地工作。

# Get the Kernel Name
Kernel=$(uname -s)
case "$Kernel" in
Linux)  Kernel="linux"              ;;
Darwin) Kernel="mac"                ;;
FreeBSD)    Kernel="freebsd"            ;;
* ) echo "Your Operating System -> ITS NOT SUPPORTED"   ;;
esac


echo
echo "Operating System Kernel : $Kernel"
echo
# Get the machine Architecture
Architecture=$(uname -m)
case "$Architecture" in
x86)    Architecture="x86"                  ;;
ia64)   Architecture="ia64"                 ;;
i?86)   Architecture="x86"                  ;;
amd64)  Architecture="amd64"                    ;;
x86_64) Architecture="x86_64"                   ;;
sparc64)    Architecture="sparc64"                  ;;
* ) echo    "Your Architecture '$Architecture' -> ITS NOT SUPPORTED."   ;;
esac


echo
echo "Operating System Architecture : $Architecture"
echo

小心,在 chrooted 32位 env 中,uname 仍然像64位主机系统那样应答。

getconf LONG_BIT运行正常。

如果没有 getconf,file /bin/cp或任何著名的可执行文件或库都可以做到这一点(但是可以存储无法使用的程序,也许这里没有)。