Bash
是否可以在其他地方使用 shell 提示符中使用的轉義碼,例如使用 echo?
例子:
- 當我跑
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}]$
整個命令提示符是橙棕色的。
總之,我的問題是:我可以列印一個命令提示符設計(帶有
echo
、cat
、less
等),就好像它是命令提示符一樣?
在 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
,您應該會看到目前路徑為綠色。請注意,它列印
\001
and\002
for\[
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 的
\u
and之類的東西\w
,您可以只使用$USER
and$PWD
代替,但是對於類似\#
or的東西\j
可能並不那麼容易。