当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《是否可以在bash脚本中检测32位与64位?》经验,为你挑选了6个好方法。

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

这将适用于Ubuntu机器.



1> bmdhacks..:
MACHINE_TYPE=`uname -m`
if [ ${MACHINE_TYPE} == 'x86_64' ]; then
  # 64-bit stuff here
else
  # 32-bit stuff here
fi


而不是`$ {MACHINE_TYPE}`你可以写`$(uname -m)`,并跳过另一个变量的声明.
除非你必须在脚本中使用它一次...
@Speredenn上面没有检查32位名称,例如i386,i686等,但是对于64位名称.你的争论没有实际意义,除非它还有可以返回的x86_64的同义词(例如amd64,但可以吗?)
在32位机器上,不建议使用此方法,因为答案将是i386,i686等...我建议赞成`getconf LONG_BIT`方法.

2> Victor Zaman..:

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

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



3> shoover..:

是否

uname -a

给你任何你可以使用的东西?我没有要测试的64位机器.


迈克斯通的注意事项:这是有效的,但具体而言

uname -m

将64位提供"x86_64",其他32位类型提供其他功能(在我的32位VM中,它是"i686").



4> lolesque..:

请注意,在chroot32位环境中,uname仍然像64位主机系统一样回答.

getconf LONG_BIT 工作良好.

file /bin/cp 如果你没有getconf(或者你可以存储你不能使用的程序,也许没有在这个地方),任何知名的可执行文件或库应该可以解决问题.



5> inukaze..:

您可以使用以下脚本(我从"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


你应该学习使用Bash的`case`语句或基本的正则表达式/通配符通配符来将所有四个32位处理块折叠成一个,因为它们是相同的.*(提示:`我[3456] 86`是你的朋友)*

6> Kevin Little..:
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


请记住,还有其他CPU架构,而不是英特尔/ AMD ......

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有