Возможно ли обнаружить 32-битное и 64-битное число в bash script?
Я пишу bash script для работы с некоторыми установками автоматическим способом... У меня есть возможность получить одну такую программу в бинарном формате 32 или 64 бит... возможно ли обнаружить машину архитектуры от bash, поэтому я могу выбрать правильный двоичный файл?
Это будет для машин Ubuntu.
Ответы
Ответ 1
ли
uname -a
дать вам все, что вы можете использовать? У меня нет 64-битной машины для тестирования.
Примечание от Майка Стоуна: Это работает, хотя специально
uname -m
Дает "x86_64" для 64 бит, а что-то другое для других 32-битных типов (в моей 32-битной VM, это "i686" ).
Ответ 2
MACHINE_TYPE=`uname -m`
if [ ${MACHINE_TYPE} == 'x86_64' ]; then
# 64-bit stuff here
else
# 32-bit stuff here
fi
Ответ 3
getconf LONG_BIT
, похоже, тоже делает трюк, что делает его еще проще проверить, так как это возвращает просто целое число вместо некоторого сложного выражения.
if [ `getconf LONG_BIT` = "64" ]
then
echo "I'm 64-bit"
else
echo "I'm 32-bit"
fi
Ответ 4
Будьте осторожны, в 32-битном env chroot
ed, uname все еще отвечает как 64-битная хост-система.
getconf LONG_BIT
отлично работает.
file /bin/cp
или любой известный исполняемый файл или библиотека должны делать трюк, если у вас нет getconf (но вы можете хранить программы, которые не можете использовать, и, возможно, их нет).
Ответ 5
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
Помните, что есть другие архитектуры процессоров, чем Intel/AMD...
Ответ 6
Вы можете использовать следующие script (я извлекаю это из официального script из "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
=============================================== ===================================
Я создаю script для обнаружения "Архитектуры", это мой простой код (я использую его с вином для своих 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
Ответ 7
Вы можете сделать что-то вроде этого:
if $(uname -a | grep 'x86_64'); then
echo "I'm 64-bit"
else
echo "I'm 32-bit"
fi
Ответ 8
Да, uname -a должен сделать трюк. см. http://www.stata.com/support/faqs/win/64bit.html.