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.
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").
MACHINE_TYPE=`uname -m`
if [ ${MACHINE_TYPE} == 'x86_64' ]; then
# 64-bit stuff here
else
# 32-bit stuff here
fi
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
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).
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
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 ...
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