Is it possible to detect 32 bit vs 64 bit in a bash script?

Bash

Bash Problem Overview


I am writing a bash script to deal with some installations in an automated way... I have the possibility of getting one such program in 32 or 64 bit binary... is it possible to detect the machine architecture from bash so I can select the correct binary?

This will be for Ubuntu machines.

Bash Solutions


Solution 1 - Bash

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

Solution 2 - Bash

Does

uname -a

give you anything you can use? I don't have a 64-bit machine to test on.


Note from Mike Stone: This works, though specifically

uname -m

Will give "x86_64" for 64 bit, and something else for other 32 bit types (in my 32 bit VM, it's "i686").

Solution 3 - Bash

getconf LONG_BIT seems to do the trick as well, which makes it even easier to check this since this returns simply the integer instead of some complicated expression.

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

Solution 4 - Bash

Be careful, in a chrooted 32-bit env, the uname is still answering like the 64-bit host system.

getconf LONG_BIT works fine.

file /bin/cp or any well-known executable or library should do the trick if you don't have getconf (but you can store programs you can't use, and maybe there are not at this place).

Solution 5 - Bash

You can use , the follow script (i extract this from officially script of "ioquake3") : for example

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

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

I'm making a script to detect the "Architecture", this is my simple code (I am using it with wine , for my Windows Games , under Linux , by each game , i use diferrent version of WineHQ, downloaded from "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

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

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

Solution 6 - Bash

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


Remember, there are other CPU architectures than Intel/AMD...

Solution 7 - Bash

You could do something like this:

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

Solution 8 - Bash

Yes, uname -a should do the trick. see: http://www.stata.com/support/faqs/win/64bit.html.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMike StoneView Question on Stackoverflow
Solution 1 - BashbmdhacksView Answer on Stackoverflow
Solution 2 - BashshooverView Answer on Stackoverflow
Solution 3 - BashVictor ZamanianView Answer on Stackoverflow
Solution 4 - BashlolesqueView Answer on Stackoverflow
Solution 5 - BashinukazeView Answer on Stackoverflow
Solution 6 - BashKevin LittleView Answer on Stackoverflow
Solution 7 - BashhoyhoyView Answer on Stackoverflow
Solution 8 - BashmuffinistaView Answer on Stackoverflow