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

是否可以在其他地方使用 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}]$
    

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

总之,我的问题是:我可以打印命令提示符设计(带有echocatless等),就像它是命令提示符一样吗?

答案1

在 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打印and 。这些对你来说可能不太有用。我们可以使用临时变量和字符串替换扩展来消除它们:\002\[\]

$ 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来代替,但是对于像\#\j之类的东西可能就不那么容易了。

相关内容