Bash
BASH - 自定義 PS1 以執行命令
我想修改我的 PS1 以每次執行一些命令。假設我想要它,如果最後執行的命令成功,它會在 PS1 的末尾添加一個綠色的微笑,否則微笑應該是紅色的。
我將它提取到一個函式中:
function exit_smile { EXITSTATUS="$?" RED="\[\e[1;31m\]" GREEN="\[\e[32;1m\]" if [ "${EXITSTATUS}" -eq 0 ] then SMILE="${GREEN}:)" else SMILE="${RED}:(" fi echo -n "$SMILE" }
然後嘗試使用
exit_smile
和\$(exit_smile)
修改 PS1 變數,但它在修改 PS1 或列印文字\[\e...\]
而不是顏色時執行一次。例如
PROMPT="\u@\h \W" PS1="${PROMPT} \$ \$(exit_smile) ${OFF}\n"
給出
username@hostname ~ $ \[\e[32;1m\]:)
我錯過了什麼?
我不確定這是否在版本(*)之間發生了變化,但是我的 Bash 手冊頁說
Bash 允許通過插入一些反斜杠轉義的特殊字元來自定義這些提示字元串,這些特殊字元解碼如下:
(列表包含
\e
,\[
等\]
)字元串解碼後,通過參數擴展,命令替換,……
這意味著
\[..\]
不能來自命令替換,但必須在此之前存在。(這也意味著您可以使用
\u
or\w
作為命令替換的參數,並且它們會在命令執行之前被替換。而且我不知道放入\[..\]
命令替換會做什麼……這會更有意義大約。)因此,我們必須將顏色程式碼放在單獨的擴展中並
\[..\]
用手保護它們。我將使用變數而不是命令替換,以及$'...'
獲取 ESC 字元的擴展:prompt_smile() { if [ "$?" = 0 ] ; then smile=' :) ' smilecolor=$'\e[1;32m' else smile=' :( ' smilecolor=$'\e[1;31m' fi normalcolor=$'\e[0m' } PROMPT_COMMAND=prompt_smile PS1='\u@\h \W \$ \[$smilecolor\]$smile\[$normalcolor\]\n'
(*我對此感到疑惑的原因是,對較舊且相似但沒有如此重複的問題的答案似乎
\[..\]
從擴展中輸出)