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

是否可以在bash脚本中检测32位对64位?,bash,Bash,我正在写一个bash脚本来自动处理一些安装。。。我有可能得到一个这样的程序在32或64位二进制。。。是否可以从bash中检测机器架构,以便选择正确的二进制文件 这将适用于Ubuntu机器。适用 uname -a 给你任何你能用的东西?我没有64位的机器可以测试 迈克·斯通(Mike Stone)的注释:这是可行的,但具体来说是可行的 uname -m 将为64位提供“x86_64”,为其他32位类型提供其他内容(在我的32位虚拟机中,它是“i686”)。您可以这样做: if $(uname

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

这将适用于Ubuntu机器。

适用

uname -a
给你任何你能用的东西?我没有64位的机器可以测试


迈克·斯通(Mike Stone)的注释:这是可行的,但具体来说是可行的

uname -m

将为64位提供“x86_64”,为其他32位类型提供其他内容(在我的32位虚拟机中,它是“i686”)。

您可以这样做:

if $(uname -a | grep 'x86_64'); then
  echo "I'm 64-bit"
else
  echo "I'm 32-bit"
fi

是的,uname-a应该可以做到这一点。请参阅:



记住,除了Intel/AMD之外,还有其他CPU体系结构…

getconf LONG\u 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
==================================================================================

我正在制作一个脚本来检测“架构”,这是我的简单代码(我在wine中使用它,对于我的Windows游戏,在Linux下,每个游戏,我使用不同版本的WineHQ,从“PlayOnLinux”网站下载

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

现在我在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

小心,在
chroot
ed32位env中,uname仍然像64位主机系统一样响应


getconf LONG\u位
工作正常


file/bin/cp
或任何著名的可执行文件或库如果没有getconf(但是你可以存储你不能使用的程序,也许这里没有)就应该这样做。

不适合我的公司,所以我不必担心;-)你可以编写
${MACHINE\u TYPE}
,而不是
${MACHINE\u TYPE}
,并跳过另一个变量的声明。除非您必须在脚本中多次使用它…在32位计算机上,不建议使用此方法,因为答案将是i386、i686等。。。我建议使用
getconf LONG\u BIT
方法。@Spereden上面的方法不检查32位名称,例如i386、i686等,而是检查64位名称。除非x86_64的同义词也可以返回(例如amd64,但它可以吗?),否则您的论点是没有意义的。使用
uname-a
然后
grep
它而不是直接使用
uname-m
您应该真正学会使用Bash的
case
语句或基本正则表达式/全局通配符,将所有四个32位处理块折叠为一个,因为它们是相同的。(提示:
i[3456]86
是你的朋友)@MestreLion:谢谢你,现在我使用的方法,我在最后描述,因为在某些posix系统中,带有“if”的系统工作不正常。使用“case/esac”可以在我希望的时候工作:D.这很好,但在msys上不起作用。另一方面,它在WSL中起作用!我认为,在其他体系结构上应该谨慎使用。我想这也会在aarch64上返回64。检测什么?中央处理器?操作系统?cpu体系结构的用户区可用性
/proc/cpuinfo
在操作系统为32位时返回64位在大多数情况下都不是很有用。
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
# 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
# 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