program tip

bash 스크립트에서 32 비트와 64 비트를 감지 할 수 있습니까?

radiobox 2020. 11. 3. 07:53
반응형

bash 스크립트에서 32 비트와 64 비트를 감지 할 수 있습니까?


자동화 된 방식으로 일부 설치를 처리하기 위해 bash 스크립트를 작성 중입니다. 이러한 프로그램을 32 비트 또는 64 비트 바이너리로 가져올 수 있습니다. bash에서 시스템 아키텍처를 감지하여 선택할 수 있습니까? 올바른 바이너리?

이것은 Ubuntu 머신 용입니다.


않습니다

uname -a

사용할 수있는 건 뭐든지 줄까요? 테스트 할 64 비트 컴퓨터가 없습니다.


Mike Stone의 참고 사항 : 이 방법은

uname -m

64 비트에는 "x86_64"를, 다른 32 비트 유형에는 다른 것을 제공합니다 (32 비트 VM에서는 "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

A의 조심 chroot에디션 32 비트 ENV,은 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

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

"아키텍처"를 감지하는 스크립트를 만들고 있습니다. 이것은 제 간단한 코드입니다 (win, Windows 게임, Linux, 각 게임 별 WineHQ, "PlayOnLinux"에서 다운로드 한 다른 버전의 WineHQ 사용). 대지.

# 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 이외의 다른 CPU 아키텍처가 있습니다.


다음과 같이 할 수 있습니다.

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

예, uname -a 가 트릭을 수행해야합니다. 참조 : http://www.stata.com/support/faqs/win/64bit.html .

참고 URL : https://stackoverflow.com/questions/106387/is-it-possible-to-detect-32-bit-vs-64-bit-in-a-bash-script

반응형