هل من الممكن اكتشاف 32 بت مقابل 64 بت في برنامج نصي bash؟[ينسخ]

StackOverflow https://stackoverflow.com/questions/106387

  •  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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top