web-dev-qa-db-fra.com

Est-il possible de détecter 32 bits contre 64 bits dans un script bash?

J'écris un script bash pour gérer certaines installations de manière automatisée ... J'ai la possibilité d'obtenir un tel programme en binaire 32 ou 64 bits ... est-il possible de détecter l'architecture de la machine à partir de bash pour pouvoir sélectionner le bon binaire?

Ce sera pour les machines Ubuntu.

69
Mike Stone

Est-ce que

uname -a

vous donne tout ce que vous pouvez utiliser? Je n'ai pas de machine 64 bits pour tester.


Note de Mike Stone: Cela fonctionne, bien que spécifiquement

uname -m

Donnera "x86_64" pour 64 bits, et quelque chose d'autre pour les autres types 32 bits (dans ma machine virtuelle 32 bits, c'est "i686").

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

getconf LONG_BIT semble également faire l'affaire, ce qui facilite encore plus la vérification car cela renvoie simplement l'entier au lieu d'une expression compliquée.

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

Attention, dans un environnement chroot ed 32 bits, l'uname répond toujours comme le système hôte 64 bits.

getconf LONG_BIT fonctionne très bien.

file /bin/cp ou tout exécutable ou bibliothèque bien connu devrait faire l'affaire si vous n'avez pas getconf (mais vous pouvez stocker des programmes que vous ne pouvez pas utiliser, et il n'y en a peut-être pas à cet endroit).

11
lolesque

Vous pouvez utiliser le script de suivi (je l'extrait officiellement du script de "ioquake3"): par exemple

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

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

Je fais un script pour détecter l '"Architecture", c'est mon code simple (je l'utilise avec wine, pour mes jeux Windows, sous Linux, par chaque jeu, j'utilise une version différente de WineHQ, téléchargée depuis "PlayOnLinux" site.

# 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

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

Maintenant, j'utilise ceci dans mes scripts bash, car cela fonctionne mieux dans n'importe quelle distribution.

# 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
8
inukaze
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


Rappelez-vous, il existe d'autres architectures CPU que Intel/AMD ...

7
Kevin Little

Vous pouvez faire quelque chose comme ça:

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