Вопрос по bash – Можно ли обнаружить 32-битные или 64-битные в сценарии Bash? [Дубликат]

68

This question already has an answer here:

How to determine whether a given Linux is 32 bit or 64 bit? 21 answers

Я пишу bash-скрипт для автоматической обработки некоторых установок ... У меня есть возможность получить одну такую программу в 32- или 64-битном двоичном формате ... Можно ли определить архитектуру машины из bash, чтобы я мог выбрать правильный бинарный файл?

Это будет для машин с Ubuntu.

Обнаружить что? ЦПУ? ОПЕРАЦИОННЫЕ СИСТЕМЫ? Пользовательская доступность архитектуры процессора?/proc/cpuinfo возвращение 64-битной версии, когда ОС 32-битная, в большинстве случаев не очень помогает. jww

Ваш Ответ

8   ответов
-2

uname -a должен сделать свое дело. увидеть:http://www.stata.com/support/faqs/win/64bit.html.

52

getconf LONG_BIT похоже, тоже делает свое дело, что облегчает проверку этого, так как это возвращает просто целое число вместо некоторого сложного выражения.

then
    echo "I'm 64-bit"
else
    echo "I'm 32-bit"
fi
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
8

скрипта «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

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

Я делаю сценарий для обнаружения «Архитектуры», это мой простой код (я использую его с Wine, для моих игр для Windows, под Linux, в каждой игре я использую разные версии WineHQ, загруженные с сайта & quot; Сайт 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 WINESER,VER="$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

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

Now i use this in my bash scripts , because works better in any distro .

# 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
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededcaseError: User Rate Limit Exceeded(Hint: i[3456]86 is your friend)
46

Есть ли

uname -a

дать вам что-нибудь, что вы можете использовать? У меня нет 64-битной машины для тестирования.

Note from Mike Stone: Это работает, хотя конкретно

uname -m

Даст & quot; x86_64 & quot; для 64-битной и что-то еще для других 32-битных типов (в моей 32-битной виртуальной машине это "i686").

11

chrooted 32-bit env, uname все еще отвечает как 64-битная хост-система.

getconf LONG_BIT работает отлично.

file /bin/cp или любой известный исполняемый файл или библиотека должны справиться с задачей, если у вас нет getconf (но вы можете хранить программы, которые вы не можете использовать, и, возможно, их нет в этом месте).

4

if $(uname -a | grep 'x86_64'); then
  echo "I'm 64-bit"
else
  echo "I'm 32-bit"
fi
Error: User Rate Limit Exceededuname -aError: User Rate Limit ExceededgrepError: User Rate Limit Exceededuname -m
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


Помните, что есть другие архитектуры CPU, чем Intel / AMD ...

Error: User Rate Limit Exceeded Mike Stone
75
MACHINE_TYPE=`uname -m`
if [ ${MACHINE_TYPE} == 'x86_64' ]; then
  # 64-bit stuff here
else
  # 32-bit stuff here
fi
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded${MACHINE_TYPE}Error: User Rate Limit Exceeded$(uname -m)Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededgetconf LONG_BITError: User Rate Limit Exceeded

Похожие вопросы