是否可以在bash脚本中检测32位与64位?
我写一个bash脚本,以应对自动化的方式有些设备...我有32或64位二进制得到这样一个程序的可能性...它可以检测从bash的机器架构,所以我可以选择正确的二进制?是否可以在bash脚本中检测32位与64位?
这将是Ubuntu机器。
是否
uname -a
给你什么,你可以使用吗?我没有64位机器来测试。
从斯通注:这工作,但具体
uname -m
会给 “x86_64的” 为64位,和别的其他32种类型(在我的32位虚拟机,它是“i686”)。
在32位机器上,不建议使用这种方法,因为答案将是i386,i686等......我建议采用`getconf LONG_BIT`方法。 – Speredenn 2014-04-25 14:38:09
@Speredenn上面不检查32位的名称,例如i386,i686等,但为64位名称。你的争用是没有意义的,除非还有可能返回的x86_64同义词(例如amd64,但它可以吗?) – 2014-07-25 17:34:45
你可以做这样的事情:
if $(uname -a | grep 'x86_64'); then
echo "I'm 64-bit"
else
echo "I'm 32-bit"
fi
有点愚蠢,使用`uname -a`然后`grep`而不是直接使用`uname -m` – MestreLion 2013-03-25 12:13:02
MACHINE_TYPE=`uname -m`
if [ ${MACHINE_TYPE} == 'x86_64' ]; then
# 64-bit stuff here
else
# 32-bit stuff here
fi
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 ...
getconf LONG_BIT
似乎这样的伎俩,以及,这使得它更容易来检查这一点,因为这将返回简单的整数,而不是一些复杂的表达。
if [ `getconf LONG_BIT` = "64" ]
then
echo "I'm 64-bit"
else
echo "I'm 32-bit"
fi
可以使用,后续的脚本(我提取这种从 “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
============== ================================================== ==================
我正在一个脚本来检测“建筑”,这是我简单的代码(我用它用酒,我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
小心,在chroot
ED 32位的env,通过uname仍然回答像64位主机系统。
getconf LONG_BIT
工作正常。
file /bin/cp
或任何着名的可执行文件或库应该做的伎俩,如果你没有getconf(但你可以存储你不能使用的程序,也许没有在这个地方)。
检测到什么?中央处理器? OS? Userland可用性的CPU架构?当OS为32位时返回64位的`/ proc/cpuinfo`在大多数情况下并不是非常有用。 – jww 2017-03-29 10:20:41