Bash

是否可以在其他地方使用 shell 提示符中使用的轉義碼,例如使用 echo?

  • July 27, 2021

例子:

  • 當我跑
echo -e "\[\033[;33m\][\t \u (\#th) | \w]$\[\033[0m\]"

列印的響應是

\[\][    \u (\#th) | \w]$\[\]

第一個之後\[和最後\]一個之前的所有東西都是橙棕色的。

  • 但是,當我將命令提示符設置為
\[\033[;33m\][\t \u (\#th) | \w]$\[\033[0m\]

命令提示符列印為

[21:55:17 {username} (89th) | {current directory path}]$

整個命令提示符是橙棕色的。

總之,我的問題是:我可以列印一個命令提示符設計(帶有echocatless等),就好像它是命令提示符一樣?

在 Bash 4.4+ 中,您可以使用${var@P},類似於如何${var@Q}生成var引用的內容,請參閱手冊中的3.5.3 Shell 參數擴展,頁面底部。

$ printf "%s\n" "${var}" 
\[\033[00;32m\]\w\[\033[00m\]\$
$ printf "%s\n" "${var@P}"  |od -tx1z
0000000 01 1b 5b 30 30 3b 33 32 6d 02 2f 74 6d 70 01 1b  >..[00;32m./tmp..<
0000020 5b 30 30 6d 02 24 0a                             >[00m.$.<
0000027

或者如果您在沒有 的情況下執行後者od,您應該會看到目前路徑為綠色。

請注意,它列印\001and \002for \[and \]。這些可能對你不太有用。我們可以使用臨時變數和字元串替換擴展來擺脫它們:

$ printf -v pst "%s\n" "${var@P}" 
$ pst=${pst//[$'\001\002']}
$ printf "%s\n" "$pst" |od -tx1z
0000000 1b 5b 30 30 3b 33 32 6d 2f 74 6d 70 1b 5b 30 30  >.[00;32m/tmp.[00<
0000020 6d 24 0a 0a                                      >m$..<
0000024

在 Zsh 中,有print -P

$ print -P "%F{green}%d%F{normal}%#" |od -tx1z
0000000 1b 5b 33 32 6d 2f 74 6d 70 2f 61 61 61 1b 5b 33  >.[32m/tmp/aaa.[3<
0000020 39 6d 25 0a                                      >9m%.<

和參數擴展標誌%,因此與上面${(%)var}的 Bash 類似${var@P},您可以使用print -v othervar -P "..."othervar=${(%)var}將生成的字元串放入othervar.


請注意,對於 Bash 的\uand之類的東西\w,您可以只使用$USERand$PWD代替,但是對於類似\#or的東西\j可能並不那麼容易。

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