[Mac / Linux] 讓你的終端介面變潮:個人化修改 Terminal / Bash 的 Prompt

Last Updated on 2020-09-02 by OneJar

工作後漸漸習慣使用終端指令介面,也就是俗稱的 Terminal Command Line Interface (CLI)。輸入命令前自動會顯示的命令提示字元 (稱為 Prompt),雖然因作業系統不同而略有差異,但提供的資訊通常大同小異,例如使用者名稱、裝置名稱、當前路徑等幾個主要項目。

有天看到別人的 Prompt 非常簡潔,這才意識到可以幫 Prompt 作點個人化的設定。有時若嫌作業系統預設的 Prompt 過於冗長累贅,不一定要接受,可以作一些修改讓 Prompt 變得更賞心悅目。

設定方式理論上對 Mac / Linux / Unix-like 系列的作業系統都適用。

我主要以 Mac (OS X) 為操作和測試對象。

範例 1:修改 Prompt

修改方式是去設定一個環境變數「PS1」,指令如下:

$ export PS1="Hello~\$ "

效果:

修改非常容易。

但通常我們會希望 Prompt 能包含一些實用資訊,例如使用者名稱、當前路徑,而不是固定文字。

該如何讓 Prompt 能動態顯示這些資訊?

範例 2:Prompt 顯示動態資訊

我們會使用一些參數來輔助取得各種動態資訊。例如:

$ export PS1="(\D{%Y-%m-%d} \t) \u@\h:\w$ "

效果:

這已經很像一般作業系統預設的格式,這個例子裡還多帶了日期時間的資訊。

常用參數表

語法中的「\D」、「\t」、「\u」、「\h」、「\w」,就是所謂的參數,每個參數各自代表不同的資訊,例如「\u」指的是「使用者名稱」,「\w」指的是「當前路徑」。

參數種類非常多,常用有以下幾個:

參數
說明
範例
\d
當前日期,以「週 月 日」的格式顯示 五  1月 05
\D{format}
當前日期,可指定格式,例如「\D{%Y-%m-%d}」 2018-01-05
\t
當前時間,以 24 小時時制顯示 21:58:33
\u
使用者名稱 OneJar
\W
當前資料夾名稱 sbin
\w
當前路徑 /usr/sbin
\h
主機名稱 (Host Name) onejar99-mac

還有很多參數,有興趣的可以參考這篇文章裡的參數清單去玩玩看。

用指令取得動態資訊

事實上,除了上述參數,也可以利用取得指令執行結果的方式去設定 Prompt。

例如日期時間,除了使用「D」和「t」去兜出想要的結果,也可以使用系統內建指令「date」取得更彈性的時間格式:

$ export PS1="(\$(date +%d.%m.%Y)) \u@\h:\w$ "

使用「\$(指令)」的語法,就會取得指令的執行結果,利用這個方式可以做到更大的客製化彈性。

但這時候會發現 Prompt 內容變長,顏色都一樣,不容易一眼辨識。作業系統預設的 Prompt 通常會對不同的資訊進行上色,例如哪一段是當前路徑,哪一段是使用者名稱,讓使用者更容易一眼區分出不同的資訊。

我們也能為 Prompt 自訂色彩嗎?當然可以!

範例 3:為 Prompt 增加色彩美化

Prompt 上色使用的是 ASCII 色碼標註,使用過 BBS 的鄉民對這種色碼標註方式一定不會陌生。

沒用過也不用擔心,照著下面的說明示範就能輕鬆上手。

以範例 2 作延伸,我想讓使用者名稱的部分顯示綠色,就使用下列語法將「\u」部分包圍起來:

$ export PS1="(\D{%Y-%m-%d} \t) \[\e[0;32m\]\u\[\e[m\]@\h:\w$ "

效果:

上色語法解說

以下會說明色碼標註語法,如果比較少接觸這類設定而一時無法理解,別擔心,再往下滑我準備了懶人包指南 😂,讓你還是能用最簡單的方法知道該如何幫 Prompt 上色。

色碼標註語法的結構說明:

1. 使用一組成對的語法將想上色的部分包圍起來。

  • 在上例中就是「\[\e[0;32m\]」和「\[\e[m\]」。
  • 如果想幫不同文字段落設定不同顏色,就會用多對語法各別去包圍。

2. 開頭語法:\[\e[0;32m\]

  • \[ 和 \]:這兩組符號包圍控制碼的範圍,不是必要,但建議有
  • \e:ASCII 的跳脫符號,表示後面接的是控制碼。
  • [0;32m:顏色控制碼,也是重點部分,會在「[」和「m」之間設定「前景顏色」、「背景顏色」、「特殊效果」

3. 結尾語法:\[\e[m\]

  • 結構原理和開頭語法一樣,差異是顏色控制碼的部分不需要內容,因為只是用來表示範圍的結束。

\[ 和 \] 的補充說明:

  • 我對這兩組符號用途的理解:避免控制碼與普通內容混和干擾,造成非預期的效果
  • 目前觀察到,在 Mac Terminal 上測試時,不加 \[ 和 \],顏色仍能生效,但當方向鍵上下顯示執行過的命令時,容易出現 Prompt 不正常殘留的問題。而如果加了 \[ 和 \],相對比較不容易出現這個狀況。
  • 在理解上,我覺得有點類似數學運算式中的小括號角色。即使無關先乘除後加減的運算優先次序問題,在很長的運算式中,我們也常常用小括號將運算式分解成很多小部份,這時候小括號並不是必要,但有助於辨識理解,也降低發生失誤的機率。

顏色控制碼解說

顏色控制碼該如何設定自己想要的顏色?

前面提到,在「[」和「m」之間可以設定「前景顏色」、「背景顏色」、「特殊效果」3 種項目:

  • 前景顏色:就是文字的顏色。ASCII 可以設定 8 種顏色,但每種顏色可以再配合「特殊效果」的「前景亮色」設定,因此以效果來說,共 16 種前景顏色
  • 背景顏色:就是文字背景的顏色,大部分 Terminal 預設都是黑色。包含黑色在內,共 8 種背景顏色
  • 特殊效果:例如原色、亮色、底線、反轉顏色,可以同時設定多種效果。

顏色控制碼設定的規則:

  1. 順序不限,習慣上順序如下面範例。
  2. 每個項目都不是必要,不需要更動預設值就不用設。
  3. 每個代碼都是獨立的,互相以分號「;」分隔
  4. 如果同一個項目設了多個值,例如同時設了兩個不同的前景顏色,以最後一個視為有效設定
\e[(特殊效果);(前景顏色);(背景顏色)m
EX1: \e[0;32m
EX2: \e[1;4;30;43m

前景顏色代碼表

代碼
顏色
30
黑色
31
紅色
32
綠色
33
黃色
34
深藍
35
紫色
36
淺藍
37
灰色

背景顏色代碼表

代碼
顏色
40
黑色
41
紅色
42
綠色
43
黃色
44
深藍
45
紫色
46
淺藍
47
灰色

特殊效果代碼表

代碼
效果
0
前景原色
1
前景亮色
4
底線
5
閃動(Mac OS X 不支援)
7
反轉前景色和背景色
9
刪除線(Mac OS X 不支援)

不同 Terminal 的色差

在不同 Terminal 上,同樣的色碼可能有視覺落差,可以用下列指令去一次瀏覽所有色系的效果:

# (前景色 - 原色)
$ export PS1="\[\e[0;30;47m\]0;30;47\[\e[m\] \[\e[0;31m\]0;31\[\e[m\] \[\e[0;32m\]0;32\[\e[m\] \[\e[0;33m\]0;33\[\e[m\] \[\e[0;34m\]0;34\[\e[m\] \[\e[0;35m\]0;35\[\e[m\] \[\e[0;36m\]0;36\[\e[m\] \[\e[0;37m\]0;37\[\e[m\] $ "

# (前景色 - 亮色)
$ export PS1="\[\e[1;30;47m\]1;30;47\[\e[m\] \[\e[1;31m\]1;31\[\e[m\] \[\e[1;32m\]1;32\[\e[m\] \[\e[1;33m\]1;33\[\e[m\] \[\e[1;34m\]1;34\[\e[m\] \[\e[1;35m\]1;35\[\e[m\] \[\e[1;36m\]1;36\[\e[m\] \[\e[1;37m\]1;37\[\e[m\] $ "

# (背景色)
$ export PS1="\[\e[40m\]40\[\e[m\] \[\e[41m\]41\[\e[m\] \[\e[42m\]42\[\e[m\] \[\e[43m\]43\[\e[m\] \[\e[44m\]44\[\e[m\] \[\e[45m\]45\[\e[m\] \[\e[46m\]46\[\e[m\] \[\e[47m\]47\[\e[m\]$ "

Prompt 上色步驟懶人包

如果上一段你看得朦朦朧朧模模糊糊,覺得很有距離美,沒關係,懶人包指南來了!

Step 1: 照範例 1 和範例 2 的解說,組織你想要的 Prompt 內容。

Step 2: 將你想要上色的部分,用「\[\e[0;32m\]」和「\[\e[m\]」包圍起來,就像範例 3。

Step 3: 參考下面這張清單,調整想要的文字顏色代號:

暗色系
亮色系
    黑色 代號=[0;30m
深灰色 代號=[1;30m
暗紅色 代號=[0;31m
亮紅色 代號=[1;31m
暗綠色 代號=[0;32m
亮綠色 代號=[1;32m
暗黃色 代號=[0;33m
亮黃色 代號=[1;33m
深藍色 代號=[0;34m
亮藍色 代號=[1;34m
暗紫色 代號=[0;35m
粉紫色 代號=[1;35m
淺藍色 代號=[0;36m
亮淺藍 代號=[1;36m
淺灰色 代號=[0;37m
    白色 代號=[1;37m

Step 4: 如果想改變背景顏色,參考上面的「背景顏色代碼表」,增加對應的代碼進去,例如:\[\e[0;32;43m\]

Step 5: 如果想增加底線效果,就增加一個「7」的代碼進去,例如:\[\e[7;0;32m\]

所以本篇文章開頭的例子,設定參數如下:

$ export PS1="\[\e[0;1;30;43m\](\D{%Y-%m-%d} \t)\[\e[m\] \[\e[0;32m\]\u\[\e[m\]@\[\e[0;35m\]\h-\$(uname -m)\[\e[m\]:\[\e[0;34m\]\w\[\e[m\]\$ "

範例 4:為 Prompt 增加 Emoji 表情符號 (Mac OS X)

但看起來好像有點不一樣,我的 Prompt 裡還有表情符號!?

沒錯!這也是作得到的。

以 Mac OS X 的操作為例:

Step 1: 在 Terminal 上,將游標移到 PS1 設定值裡要插入 Emoji 的地方,點應用程式的「編輯 (Edit)」選單,選擇「表情符號和其他符號 (Emoji & Symbols)」。

2020/09/02 updated: 有更快的方式可以叫出 Emoji 選單,使用快捷鍵「Control+Command⌘+空白鍵」

Step 2: 在游標的地方會跳出符號選擇的工具框,點選欲插入的表情符號。

Step 3: 就會看到表情符號已經插入設定值裡,按下 ENTER 執行即設定成功。

根據我的操作經驗,直接在 Terminal 上進行 Emoji 的插入容易不正常。比較建議的方式是使用 Mac 內建的「文字編輯軟體」,用同樣的方法產生 Emoji,再複製到 Terminal 上。

總結

本文重點回顧:

  • 如何修改 Prompt
  • 利用參數或指令,讓 Prompt 動態取得系統資訊
  • 為 Prompt 作前景、背景的上色,甚至加上底線
  • 幫 Prompt 加上表情符號

參考資料

發表留言