一般而言,Bash Shell 是很多 Linux 發行版的預設 Shell,所以會隨著系統的安裝而自動安裝。不過確實有一部分讀者想要安裝較新版本的 Bash Shell,所以本節會具體講一下其安裝方法,希望可以作為讀者全新安裝 Bash Shell 或者雖然已經安裝但希望升級的參考。
確定你的 Shell 版本
如果你安裝的 Linux 是 RedHat、CentOS、Fedora、Ubuntu、Debian 等主流發行版,那麼在你的系統中很可能已經預裝了 Bash Shell,只需要確認一下是否確實已經安裝以及預裝的版本即可。具體的方法是:
# 確認系統中使用的 Shell 是 bash
$ echo $SHELL
/bin/bash
# 檢視系統中 Bash Shell 的版本(方法一)
$ bash --version
GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
# 檢視系統中 Bash Shell 的版本(方法二)
$ echo $BASH_VERSION
3.2.25(1)-release
原始碼方式安裝 Bash
Linux 下安裝軟體的方式無非是 RPM 包安裝、yum 安裝、原始碼安裝三種方式,讀者可以任選一種方式。
不過,相對來說 RPM 包安裝和 yum 安裝方式比較簡單,若再考慮各種包的依賴關係,這兩種方式中又屬 yum 安裝更為簡單。這裡就不詳細介紹這兩種安裝方法了,下面會具體示範使用原始碼安裝 bash 的過程。
首先存取 http://www.gnu.org/software/bash/bash.html 頁面,在 Downloads 中選擇一個下載的連結,筆者選擇了中國科技大學提供的FTP下載目錄:ftp://mirrors.ustc.edu.cn/gnu/bash/。
當前很多生產環境的系統中使用的 bash 版本還是 3.2 版,讀者可以根據實際需要選擇具體的版本。在筆者撰寫本教學時,最新的版本是 4.2 版本,所以這裡使用這個版本來做示範。
1) 使用wget下載最新的 bash 原始碼包
具體操作如下所示:
$ wget ftp://mirrors.ustc.edu.cn/gnu/bash/bash-4.2.tar.gz
--2013-04-11 19:37:41-- ftp://mirrors.ustc.edu.cn/gnu/bash/bash-4.2.tar.gz
=> `bash-4.2.tar.gz'
Resolving mirrors.ustc.edu.cn... 202.141.160.110, 2001:da8:d800:95::110
Connecting to mirrors.ustc.edu.cn|202.141.160.110|:21... connected.
Logging in as anonymous ... Logged in!
==> SYST ... done. ==> PWD ... done.
==> TYPE I ... done. ==> CWD /gnu/bash ... done.
==> SIZE bash-4.2.tar.gz ... 7009201
==> PASV ... done. ==> RETR bash-4.2.tar.gz ... done.
Length: 7009201 (6.7M)
100%[==========================================>] 7,009,201 1.93M/s in 3.5s
2013-04-11 19:37:46 (1.89 MB/s) - `bash-4.2.tar.gz' saved [7009201]
2) 解壓原始碼包
解壓原始碼包並進入生成的目錄中:
# 解壓後會在當前目錄下生成一個bash-4.2目錄
$ tar zxvf bash-4.2.tar.gz
#進入目錄bash-4.2
$ cd bash-4.2
$
3) 準備設定(configure)
最簡單的設定方式是直接執行當前目錄下的 configure,這會將 bash 安裝到 /usr/local 目錄中,不過編譯安裝軟體時,好的習慣是使用
--prefix
引數指定安裝目錄。所以這裡採用下面的設定方式。該條命令將會產生大量的輸出,一開始會檢查系統的編譯環境以及相關的依賴軟體。
最常見的錯誤可能是系統中沒有安裝 gcc 造成無法繼續,如果是這個原因,使用 yum install gcc 命令進行安裝。如果設定過程出現致命錯誤會立即退出,請讀者注意輸出內容中的 error 部分。
$ ./configure --prefix=/usr/local/bash4.2
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
Beginning configuration for bash-4.2-release for i686-pc-linux-gnu
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... Yes
......(略去內容)......
#如果大量的 checking 沒問題,則設定環境檢測通過。如果讀者看到如下的輸出內容,說明設定成功
configure: creating ./config.status
config.status: creating Makefile
config.status: creating builtins/Makefile
config.status: creating lib/readline/Makefile
config.status: creating lib/glob/Makefile
config.status: creating lib/intl/Makefile
config.status: creating lib/malloc/Makefile
config.status: creating lib/sh/Makefile
config.status: creating lib/termcap/Makefile
config.status: creating lib/tilde/Makefile
config.status: creating doc/Makefile
config.status: creating support/Makefile
config.status: creating po/Makefile.in
config.status: creating examples/loadables/Makefile
config.status: creating examples/loadables/perl/Makefile
config.status: creating config.h
config.status: executing default-1 commands
config.status: creating po/POTFILES
config.status: creating po/Makefile
config.status: executing default commands
#如果設定成功,會在當前目錄中生成Makefile
$ ll Makefile
-rw-r--r-- 1 root root 77119 Apr 11 19:49 Makefile
4) 正式編譯
#編譯過程會產生大量輸出
$ make
rm -f mksyntax
gcc -DPROGRAM='"bash"' -DCONF_HOSTTYPE='"i686"'
-DCONF_OSTYPE='"linux-gnu"' -DCONF_MACHTYPE='"i686-pc-linux-gnu"'
-DCONF_VENDOR='"pc"'
-DLOCALEDIR='"/usr/local/bash4.2/share/locale"'
-DPACKAGE='"bash"' -DSHELL -DHAVE_CONFIG_H -I. -I. -I./include
-I./lib -g -o mksyntax ./mksyntax.c
......(略去內容)......
5) 安裝
有時在安裝前也可以進行測試,但是一般情況下這不是必需的。
#非必要步驟:測試安裝
#[[email protected] bash-4.2]# make test
#安裝
$ make install
#安裝其實就是將make產生的檔案複製到指定的目錄中,在這裡指定的目錄就是之前我們用 --prefix 引數指定的/usr/local,可以在該目錄中發現bash4.2目錄
$ ls -ld /usr/local/bash4.2/
drwxr-xr-x 4 root root 4096 Apr 11 20:08 /usr/local/bash4.2/
到此為止,最新版本的 bash 就已經安裝好了,確切地說是安裝到了 /usr/local/bash4.2 中。
使用新版本的 Bash Shell
雖然最新版的 bash 已經安裝到系統中,但是還需要經過一些設定才能使用。首先需要將最新的 bash 的路徑寫到 /etc/shells 中,以向系統註冊新 Shell 的路徑。可以採取直接編輯 /etc/shells 檔案的方式,或者採用如下更簡單的方式:
$ echo "/usr/local/bash4.2/bin/bash" >> /etc/shells
然後使用命令 chsh(change shell 的簡寫)修改登入 Shell。
$ chsh
Changing shell for root.
New shell [/bin/bash]: /usr/local/bash4.2/bin/bash #輸入要修改的shell
Shell changed. #顯示成功修改了shell
#此處chsh並沒有附加引數,所以預設是修改root的shell,如要改變其他使用者的登入shell,可以在後面跟上使用者名稱,使用這種方式給使用者john更改shell
$ chsh john
chsh 命令做的工作就是修改了 /etc/passwd 檔案中登入 Shell 的路徑,所以如果明白了 chsh 的原理,實際上可以手工編輯 /etc/passwd 檔案,將 root 使用者的這行改成下面的樣子(這又一次印證了 Linux 中一切皆檔案的說法):
$ cat /etc/passwd | grep bash4.2
root:x:0:0:root:/root:/usr/local/bash4.2/bin/bash
最後還需要重新登入以獲得 Shell,登入後再次驗證一下當前的 Shell 版本。
$ echo $BASH_VERSION
4.2.0(1)-release
#請注意,如果這時候你使用下面的命令可能會犯迷糊:為什麼版本是3.2.25呢?不是已經是4.2了嗎?
$ bash --version
GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
#通過使用 whereis bash 命令可了解當前執行的 bash 命令真實執行的是/bin/bash,也就是說現在是在版本為 4.2 的 bash 中執行了一個 3.2.25 版本的 bash 命令。如果要想每次執行 bash 的時候使用的是 4.2 的版本,需要修改 PATH 變數的值,讀者可以自行完成這個任務
$ whereis bash
bash: /bin/bash /usr/local/bash4.2 /usr/share/man/man1/bash.1.gz