前言
在類 UNIX 系統(比如 Linux,Mac)環境中,我們常常在終端中輸入命令與系統進行交互,大多數系統默認使用的 shell 程序為 Bash。
但是 Bash 本身的色調非常單調,因此,如果我們需要長時間工作在命令行環境種,適當對終端進行美化是一個非常不錯的選擇。
幾個概念釋義
在我們美化 Linux 終端前,我們先了解一下以下幾個概念:
-
終端(terminal):擁有鍵盤+顯示器的設備。
-
終端模擬器(terminal emulator):采用圖形界面模擬 終端 操作的程序。
-
shell:操作系統和終端之間的一個“殼”應用,可以將終端發送的字符(命令)發送給系統,並將系統運行命令的結果傳遞給終端顯示。
-
Bash:大多數類 UNIX 系統的默認 shell 程序。
注:在類 UNIX 系統中,通常將 終端模擬器 簡稱為 終端,因此下文涉及到 終端 的地方,如無特別強調,均指 終端模擬器。
zsh
在前面對 終端,終端模擬器,shell 進行介紹后,我們應當能知道,大多數類 UNIX 系統自帶的終端(即命令行工具),其界面相對比較單調。
因此,如果我們想美化終端,可以更換另一個更加美觀的終端(比如 Mac 系統的 iterm2),或者更換另一個可以配置終端的 shell 程序。
我們這里主要對 Ubuntu 系統終端進行美化,所以選擇更換 shell。
目前類 UNIX 系統上最常用的第三方 shell 就是 zsh:zsh 又稱為 Z shell,是一個交互式 shell 程序,也可以作為腳本解釋器。zsh 基於 Bourne Shell(sh),提供了很多新特性,比如插件支持和主題更換。
zsh 的安裝方法如下:這里主要介紹在 Ubuntu 系統中進行安裝:
- 下載並安裝 zsh:
sudo apt install zsh
- 查看是否安裝成功:
zsh --version # ==> Expected result: zsh 5.4.2 or more recent
- 設置為終端默認 shell:
chsh -s $(which zsh)
- 如果第 3 步設置失敗,則進行如下設置:
# ~/.bash_profile 添加如下內容
export SHELL=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l
- 登出,然后再登入,輸入以下命令查看下是否已登錄 zsh:
echo $SHELL # ==> 如果顯示: /bin/zsh,則為成功
- 輸入以下命令,查看當前是否使用 zsh:
$SHELL --version # ==> Expected result: 'zsh 5.4.2' or similar
更多安裝方法,請查看:Installing ZSH
Oh-My-Zsh
zsh 本身的配置十分復雜,因此一般不直接對其進行配置,而是使用第三方框架進行設置。
以下是 Oh-My-Zsh 的安裝方法:
# 使用 curl
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# 或者使用 wget
sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# 或者手動進行安裝
curl -Lo install.sh https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh
sh install.sh
Oh-My-Zsh 常用配置
當安裝完成 Oh-My-Zsh 后,會發現創建了~/.zshrc
文件,這就是 zsh 的配置文件。
Oh-My-Zsh 為 zsh 提供了很多的插件(Plugin)和主題(Theme)配置。
- 插件(Plugin):zsh 插件,簡單來說,就是 zsh 可以解釋執行的一段 shell 腳本。因此,一個插件可以簡單地執行一些命令,也可以提供對特定命令和函數的補全功能。
要使用 插件,首先需要使能插件功能,方法如下:
在~/.zshrc
文件中,添加如下內容:
plugins=(
git
adb
ruby
)
如上就是添加了 git,adb,ruby 插件,更多其他插件,請參考:zsh Plugins
要使用 主題,首先需要使能該功能,方法如下:
在~/.zshrc
文件中,設置ZSH_THEME
為要使用的具體主題名,比如:
ZSH_THEME=robbyrussell
如上就是讓 zsh 啟用robbyrussell
主題。更多其他主題,請參考:zsh Themes。
注:如果不想使用主題,直接設置:ZSH_THEME=""
這里推薦一個主題:powerlevel10k,安裝方法如下:
# 首先下載到 on-my-zsh 的本地目錄
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git $ZSH_CUSTOM/themes/powerlevel10k
# ~/.zshrc 設置如下內容
ZSH_THEME="powerlevel10k/powerlevel
進階配置
Oh-My-Zsh 對插件和主題的配置雖然很簡單,但是對於非內置組件,我們還需要進行手動下載,再進行配置。而這些步驟,完全可以進行自動化。
因此,網絡上其實已存在很多的 zsh 的插件管理器,比如:antigen,zgen,zplug...
但是這里我推薦的是:zinit。
多方測評表明,zinit 是當前加載速度最快的 zsh 插件管理器,並且隨着插件的數量增多,zinit 的優勢會更大。
zinit 的插件加載速度快的一個主要原因就是:其提供了一個 插件延遲加載(Turbo) 的功能,使得插件可以在 zsh 啟功后,再進行加載。
下面是 zinit 的安裝方法:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/zdharma/zinit/master/doc/install.sh)"
安裝完成 zinit 后,我們就可以在~/.zshrc
中配置插件/主題,比如,對於上文建議使用的 powerlevel10k 主題,其安裝方法如下:
- 在
~/.zshrc
文件中配置主題為 powerlevel10k:
# ~/.zshrc
# 原生的主題配置可去除
# ZSH_THEME="powerlevel10k/powerlevel
zinit ice depth=1; zinit light romkatv/powerlevel10k
- 重新加載
~/.zshrc
:
source ~/.zshrc
此時就可以看到 zinit 會去下載 powerlevel10k,並自動進行設置。
注:可以通過執行p10k configure
命令來配置 powerlevel10k,在執行該命令之前,建議先安裝以下字體:
直接雙擊下載的文件,選擇安裝,然后在設置終端字體為MesloLGS NF
即可。
更多 zinit 的用法,請查看:zsh 插件管理器 - Zinit
最后放上效果圖以及附上本人配置:.zshrc、.p10k.zsh

終端發展史
以下是在查閱資料的時候,從網上看到的一個問答:「What's the difference between terminal, shell, command line, and bash?」,里面有人對終端的發展演化進行了介紹,我覺得介紹很簡潔,就簡單記錄一下:
在 19 世紀末期,有一種叫做 teletype 或者 TTY 的技術。一個由幾個電子元器件組成的老式機械打印機,基本上可以被划分為兩部分:鍵盤 和 打印機。兩者之間由電線進行連接,你可以通過在鍵盤上打字,此時遠端的打印機就會一個一個的回顯鍵盤輸入的字符。
在 20 世紀時,計算機開始興起,電傳打字技術(teletype technology )就很快地被應用到計算機上。用戶可以使用鍵盤進行輸入,從而對計算機進行控制,打印機可以同時連接到相同的計算機上,實時回顯用戶的操作輸出。
電傳打字技術提供了一個 命令行交互接口(command line interface) 風格的用戶接口。命令行交互接口其實就只是用於與計算機進行交互的一種方式:即用戶輸入一個命令給到計算機,然后計算機回顯操作結果並且等待下一個命令。
CRT 視頻顯示技術(CRT video display technology )在計算機出現之前就已經存在了,因此人們很快就察覺到可以將視頻顯示與計算機結合起來。一個顯著的例子就是1950年時的 SAGE air defense system,詳情可查看該視頻(從 3:40 開始)。
由於計算機與視頻顯示技術聯合越來越常見,現存的 命令行接口 思想就很快地被應用於新的系統 -- 保留了鍵盤,但是將打印機替換為屏幕(顯示器)。這種 鍵盤+文字顯示 的設備就被稱為 終端(terminal),由於它在計算機連接的另一端,你可以認為它 “終止” 了連接。
所以 終端(terminal) 就是帶有鍵盤和屏幕的設備,要么通過電話線經由調制解調器,或者通過實體線纜連接到一台大型計算機(通常是大型機或者早期的 UNIX-based 系統)上。終端 的功能只能在屏幕上顯示遠程計算機發送來的文字信息,或者發送按鍵字符給到遠程計算機。創建文字顯示 UI 是由計算機負責的。之所以稱為 終端 是因為它位於計算機連線的末端,或者說 “終止端”。
因此為了讓系統能夠發揮效用,計算機中必須運行一種可以告訴 終端 顯示數據和處理用戶按鍵輸入的應用程序,在 UNIX(以及后來的 Linux)世界中,這種應用程序就被稱作 shell。
shell 就是提供命令行接口的應用程序。任何提供用戶接口的應用在寬松定義上都可認為是 shell,比如 Windows,Mac 和 手機提供的圖形用戶界面就可以認為是一種圖形化 shell。
不同的 shell 可以有不同方式進行命令輸入,重定向輸入/輸出流,管理復雜任務,比如同時運行多個程序等等。在早期的 UNIX 中,創建了許多不同的 shell 程序,很多到現在仍然存在。Bash 就是最受歡迎的 shell 程序,並且是許多 Linux 和 UNIX 系統的默認 shell。
今天,許多需要使用 終端 來執行操作的用戶都使用了擁有圖形界面的 GUI 應用程序,這種有 GUI 界面的應用我們稱之為 終端模擬器(terminal emulator)。它模擬了具備字符輸入功能的終端設備。這看起來可能不重要,當在它們過時之前,終端就已具備額外的功能,比如鼠標和顏色文字。因此,終端模擬器是更加復雜的應用。
在類 UNIX 系統(包括一些 Linux 發行版本 和 Mac)中,終端模擬器 常常被簡稱為 終端(terminal),並且它的默認行為就是去啟動默認的 shell 程序(通常是 Bash),並將 終端 的輸入/輸出連接到 shell。*
綜上,終端(模擬器) 就是指有圖形界面的命令行工具(Command line)。
在類 UNIX 中,shell 默認為 Bash。
在 Windows 系統中,它有兩種 shell:cmd.exe
和 powershell.exe