2008-09-19 11 views
60

Estoy escribiendo un script bash para tratar algunas instalaciones de forma automática ... Tengo la posibilidad de obtener uno de esos programas en binario de 32 o 64 bits ... ¿es posible detectar la arquitectura de la máquina de bash, así que puede seleccionar el binario correcto?¿Es posible detectar 32 bits frente a 64 bits en un script bash?

Esto será para máquinas Ubuntu.

+0

¿Detectar qué? ¿UPC? OS? ¿Disponibilidad del usuario de una arquitectura de CPU? '/ proc/cpuinfo' que devuelve 64 bits cuando el sistema operativo es de 32 bits no es muy útil en la mayoría de los casos. – jww

Respuesta

39

¿El

uname -a 

le dan todo lo que puede utilizar? No tengo una máquina de 64 bits para probar.


Nota de Mike Stone: Esto funciona, aunque específicamente

uname -m 

Dará "x86_64" de 64 bits, y algo más para otros tipos de 32 bits (en mi poco VM 32, es "i686").

+3

En máquinas de 32 bits, no se recomienda este método ya que la respuesta será i386, i686, etc. ... Aconsejaría favorecer el método 'getconf LONG_BIT'. – Speredenn

+0

@Speredenn lo anterior no comprueba el nombre de 32 bits, p. Ej. i386, i686, etc., pero para el nombre de 64 bits. Su argumento es discutible a menos que también haya sinónimos para x86_64 que podría devolver (por ejemplo, amd64, pero ¿verdad?) –

4

se podría hacer algo como esto:

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

es un poco tonto usar 'uname -a' y luego' grep' en lugar de usar directamente 'uname -m' – MestreLion

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

en lugar de '$ {MACHINE_TYPE}' puede escribir '$ (uname -m)' y omitir la declaración de otra variable. – Qsiris

+7

A menos que tenga que usarlo más de una vez en su secuencia de comandos ... – Abai

+1

En máquinas de 32 bits, este método no es recomendable ya que la respuesta será i386, i686, etc. ... Aconsejaría preferir el 'getconf LONG_BIT' método. – Speredenn

7
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 


Recuerde, hay otras arquitecturas de CPU que Intel/AMD ...

+0

no para mi empresa, así que no tengo que preocuparme ;-) –

50

getconf LONG_BIT parece hacer el truco, así, que hace que sea aún más fácil de comprobar esto, ya que esto devuelve simplemente el número entero vez de alguna expresión complicada.

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

Está bien, pero no funciona msys. –

7

Se puede utilizar, la secuencia de comandos de seguimiento (I Extracto esto desde oficialmente guión de "ioquake3"): por ejemplo

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 

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

Estoy haciendo un script para detectar la "Arquitectura", este es mi código simple (lo estoy usando con vino, para mi Windows Games, en Linux, para cada juego, uso una versión diferente de WineHQ, descargada del sitio "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 

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

Ahora uso esto en mi fiesta secuencias de comandos, porque funciona mejor en cualquier distribución.

# 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 
+4

Realmente debería aprender a usar la instrucción 'case' de Bash, o comodines regex/globbing básicos, para colapsar los cuatro bloques de manejo de 32 bits en uno solo, ya que son idénticos. * (Sugerencia: 'yo [3456] 86' es tu amigo) * – MestreLion

+0

@MestreLion: Gracias, ahora uso el método, lo describo en la final, porque, en algún sistema posix, con" si ", no funcionan bien y con el uso de "case/esac" funciona cuando deseo: D. – inukaze

11

Ten cuidado, en un chroot ed env 32 bits, el uname sigue respondiendo al igual que el sistema anfitrión 64 bits.

getconf LONG_BIT funciona bien.

file /bin/cp o cualquier archivo ejecutable o biblioteca bien conocido debe hacer el truco si no tiene getconf (pero puede almacenar programas que no puede usar, y tal vez no hay en este lugar).

Cuestiones relacionadas