是否可以在其他地方使用 shell 提示中使用的转义码,例如使用 echo?

Luk*_*kas 2 command-line bash prompt escape-characters

例子:

总之,我的问题是:我能有一个命令提示符设计印刷(有echocatless,等),就好像它是命令提示符?

ilk*_*chu 6

在 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
Run Code Online (Sandbox Code Playgroud)

或者,如果您在没有 的情况下运行后者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
Run Code Online (Sandbox Code Playgroud)

在 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%.<
Run Code Online (Sandbox Code Playgroud)

和参数扩展标志%,因此${(%)var}类似于${var@P}上面的Bash ,您可以使用print -v othervar -P "..."othervar=${(%)var}将结果字符串放入othervar.


请注意,对于 Bash 的\uand 之类的东西\w,您可以只使用$USERand$PWD代替,但对于类似\#\j那样的东西,可能并不那么容易。

  • 在 zsh 中,还有 `%` 参数扩展标志(更接近于 bash 的 @P,虽然比它早了几十年)。 (2认同)