هل من الممكن اكتشاف 32 بت مقابل 64 بت في برنامج نصي bash؟[ينسخ]
-
01-07-2019 - |
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
أقوم بكتابة برنامج نصي bash للتعامل مع بعض عمليات التثبيت بطريقة آلية ...لدي إمكانية الحصول على أحد هذه البرامج في ثنائي 32 أو 64 بت ...هل من الممكن اكتشاف بنية الآلة من bash حتى أتمكن من تحديد الثنائي الصحيح؟
سيكون هذا لأجهزة Ubuntu.
المحلول
يفعل
uname -a
أعطيك أي شيء يمكنك استخدامه؟ليس لدي جهاز 64 بت للاختبار عليه.
ملاحظة من مايك ستون: هذا يعمل، على الرغم من على وجه التحديد
uname -m
سأعطي "x86_64" للإصدار 64 بت، وشيئًا آخر لأنواع 32 بت الأخرى (في جهاز VM 32 بت الخاص بي، إنه "i686").
نصائح أخرى
MACHINE_TYPE=`uname -m`
if [ ${MACHINE_TYPE} == 'x86_64' ]; then
# 64-bit stuff here
else
# 32-bit stuff here
fi
getconf LONG_BIT
يبدو أنه يقوم بالمهمة أيضًا، مما يجعل التحقق من ذلك أسهل نظرًا لأن هذا يُرجع ببساطة عددًا صحيحًا بدلاً من بعض التعبيرات المعقدة.
if [ `getconf LONG_BIT` = "64" ]
then
echo "I'm 64-bit"
else
echo "I'm 32-bit"
fi
كن حذرا، في chroot
مع بيئة 32 بت، لا يزال uname يستجيب مثل النظام المضيف 64 بت.
getconf LONG_BIT
يعمل بشكل جيد.
file /bin/cp
أو أي ملف تنفيذي أو مكتبة معروفة يجب أن تقوم بالمهمة إذا لم يكن لديك getconf (ولكن يمكنك تخزين البرامج التي لا يمكنك استخدامها، وربما لا توجد في هذا المكان).
يمكنك استخدام البرنامج النصي التالي (استخرجته من البرنامج النصي الرسمي لـ "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
==================================================================================
أقوم بإنشاء برنامج نصي لاكتشاف "الهندسة المعمارية"، وهذا هو الكود البسيط الخاص بي (أنا أستخدمه مع wine، لألعاب 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
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...
يمكنك أن تفعل شيئا مثل هذا:
if $(uname -a | grep 'x86_64'); then
echo "I'm 64-bit"
else
echo "I'm 32-bit"
fi
نعم، اسم -أ يجب أن تفعل الخدعة.يرى: http://www.stata.com/support/faqs/win/64bit.html.