Bash

使用變數儲存 PS1 的終端顏色程式碼?

  • July 3, 2014

在我的.bashrc中,我使用 ANSI 終端顏色程式碼為各種位著色。它看起來像這樣:

PS1='\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ '

wherevirtual_envgit_branch是在標準輸出上輸出內容的 bash 函式。

現在,為了更容易閱讀和修改,我想將顏色程式碼儲存在變數中並引用它們,而不是直接將它們嵌入到PS1. 所以我有一堆這樣的變數:

GREEN="\[\033[32m\]"
YELLOW="\[\033[33m\]"
RESET="\[\033[0m\]"

我希望能夠寫出類似的東西:

PS1='\u@\h:\w${YELLOW}$(virtual_env)${GREEN}$(git_branch)${RESET}$ '

但這不起作用 - 顏色程式碼顯示在提示中,就像它們被轉義一樣。如果我使用雙引號代替,顏色可以正常工作PS1,但只有在我這樣做時提示才會改變source ~/.bashrc

我已經嘗試過我見過人們做的其他事情——使用printf, 使用單引號作為顏色,將\[and\]放入PS1而不是顏色變數,但似乎沒有任何效果。

如何為顏色程式碼使用變數?

解決方案是在定義提示時讓 shell 替換顏色變數,而不是函式。為此,請使用您最初嘗試過的雙引號,但對命令進行轉義,以便在繪製提示之前不對它們進行評估。

PS1="\u@\h:\w${YELLOW}\$(virtual_env)${GREEN}\$(git_branch)${RESET}$ "

注意每個命令的\前面$()

如果我們回顯這一點,我們會看到:

echo "$PS1"
\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ 

如您所見,顏色變數被替換了,但命令沒有。

引用自:https://unix.stackexchange.com/questions/140610