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 種背景顏色。
- 特殊效果:例如原色、亮色、底線、反轉顏色,可以同時設定多種效果。
顏色控制碼設定的規則:
- 順序不限,習慣上順序如下面範例。
- 每個項目都不是必要,不需要更動預設值就不用設。
- 每個代碼都是獨立的,互相以分號「;」分隔。
- 如果同一個項目設了多個值,例如同時設了兩個不同的前景顏色,以最後一個視為有效設定。
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 加上表情符號
參考資料
- How to Customize your Terminal Prompt
- How to: Change / Setup bash custom prompt (PS1)
- Escape Character之應用-ANSI色彩
- [轉錄]色碼簡表
- Emoji (繪文字) 表情符號簡介