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

问题描述:

我写一个bash脚本,以应对自动化的方式有些设备...我有32或64位二进制得到这样一个程序的可能性...它可以检测从bash的机器架构,所以我可以选择正确的二进制?是否可以在bash脚本中检测32位与64位?

这将是Ubuntu机器。

+0

检测到什么?中央处理器? OS? Userland可用性的CPU架构?当OS为32位时返回64位的`/ proc/cpuinfo`在大多数情况下并不是非常有用。 – jww 2017-03-29 10:20:41

是否

uname -a 

给你什么,你可以使用吗?我没有64位机器来测试。


从斯通注:这工作,但具体

uname -m 

会给 “x86_64的” 为64位,和别的其他32种类型(在我的32位虚拟机,它是“i686”)。

+3

在32位机器上,不建议使用这种方法,因为答案将是i386,i686等......我建议采用`getconf LONG_BIT`方法。 – Speredenn 2014-04-25 14:38:09

+0

@Speredenn上面不检查32位的名称,例如i386,i686等,但为64位名称。你的争用是没有意义的,除非还有可能返回的x86_64同义词(例如amd64,但它可以吗?) – 2014-07-25 17:34:45

你可以做这样的事情:

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

有点愚蠢,使用`uname -a`然后`grep`而不是直接使用`uname -m` – MestreLion 2013-03-25 12:13:02

MACHINE_TYPE=`uname -m` 
if [ ${MACHINE_TYPE} == 'x86_64' ]; then 
    # 64-bit stuff here 
else 
    # 32-bit stuff here 
fi 
+9

而不是`$ {MACHINE_TYPE}`你可以直接写`$(uname -m)`,并跳过另一个变量的声明。 – Qsiris 2012-10-25 20:32:54

+7

除非你必须在脚本中多用一次...... – Abai 2013-01-29 13:29:35

+1

在32位机器上,不建议使用这种方法,因为答案将是i386,i686等......我建议倾向于使用`getconf LONG_BIT`方法。 – Speredenn 2014-04-25 14:37:48

是,UNAME -a应该做的伎俩。见: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 


记住,还有其他CPU架构比Intel/AMD ...

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 "[email protected]" 
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 

小心,在chroot ED 32位的env,通过uname仍然回答像64位主机系统。

getconf LONG_BIT工作正常。

file /bin/cp或任何着名的可执行文件或库应该做的伎俩,如果你没有getconf(但你可以存储你不能使用的程序,也许没有在这个地方)。