2008-09-19 102 views
60

我寫一個bash腳本,以應對自動化的方式有些設備...我有32或64位二進制得到這樣一個程序的可能性...它可以檢測從bash的機器架構,所以我可以選擇正確的二進制?是否可以在bash腳本中檢測32位與64位?

這將是Ubuntu機器。

+0

檢測到什麼?中央處理器? OS? Userland可用性的CPU架構?當OS爲32位時返回64位的`/ proc/cpuinfo`在大多數情況下並不是非常有用。 – jww 2017-03-29 10:20:41

回答

39

是否

uname -a 

給你什麼,你可以使用嗎?我沒有64位機器來測試。


從斯通注:這工作,但具體

uname -m 

會給 「x86_64的」 爲64位,和別的其他32種類型(在我的32位虛擬機,它是「i686」)。

+3

在32位機器上,不建議使用這種方法,因爲答案將是i386,i686等......我建議採用`getconf LONG_BIT`方法。 – Speredenn 2014-04-25 14:38:09

+0

@Speredenn上面不檢查32位的名稱,例如i386,i686等,但爲64位名稱。你的爭用是沒有意義的,除非還有可能返回的x86_64同義詞(例如amd64,但它可以嗎?) – 2014-07-25 17:34:45

4

你可以做這樣的事情:

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

有點愚蠢,使用`uname -a`然後`grep`而不是直接使用`uname -m` – MestreLion 2013-03-25 12:13:02

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

而不是`$ {MACHINE_TYPE}`你可以直接寫`$(uname -m)`,並跳過另一個變量的聲明。 – Qsiris 2012-10-25 20:32:54

+7

除非你必須在腳本中多用一次...... – Abai 2013-01-29 13:29:35

+1

在32位機器上,不建議使用這種方法,因爲答案將是i386,i686等......我建議傾向於使用`getconf LONG_BIT`方法。 – Speredenn 2014-04-25 14:37:48

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

50

getconf LONG_BIT似乎這樣的伎倆,以及,這使得它更容易來檢查這一點,因爲這將返回簡單的整數,而不是一些複雜的表達。

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

可以使用,後續的腳本(我提取這種從 「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 
11

小心,在chroot ED 32位的env,通過uname仍然回答像64位主機系統。

getconf LONG_BIT工作正常。

file /bin/cp或任何着名的可執行文件或庫應該做的伎倆,如果你沒有getconf(但你可以存儲你不能使用的程序,也許沒有在這個地方)。

相關問題