web-dev-qa-db-ja.com

bashスクリプトで32ビットと64ビットを検出することは可能ですか?

私は自動化された方法でいくつかのインストールを処理するbashスクリプトを書いています... 32または64ビットバイナリでそのようなプログラムを取得する可能性があります...選択できるようにbashからマシンアーキテクチャを検出することは可能ですか?正しいバイナリ?

これはUbuntuマシン用です。

69
Mike Stone

する

uname -a

使えるものは何ですか?テストする64ビットマシンはありません。


マイク・ストーンからのメモ:これは機能しますが、具体的には

uname -m

64ビットの場合は「x86_64」、その他の32ビットタイプの場合は何か(32ビットVMでは「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もトリックを行うようです。これにより、複雑な式の代わりに単純に整数が返されるため、チェックがさらに簡単になります。

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

chrooted 32ビット環境では、una​​meが64ビットホストシステムのように応答していることに注意してください。

getconf LONG_BIT 正常に動作します。

file /bin/cpまたは既知の実行可能ファイルまたはライブラリは、getconfを持たない場合にトリックを実行する必要があります(ただし、使用できないプログラムを保存でき、この場所にない場合もあります)。

11
lolesque

次のスクリプトを使用できます(「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 "$@"
done

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

私は「アーキテクチャ」を検出するスクリプトを作成しています。これは私の簡単なコードです(WindowsゲームではLinuxで、各ゲームではWineを使用しています。地点。

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


Intel/AMD以外のCPUアーキテクチャもあります...

7
Kevin Little

次のようなことができます:

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