例子:
当我跑步时
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
等),就像它是命令提示符一样吗?
答案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
,您应该会看到当前路径呈绿色。
请注意,它为\001
and打印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 的\u
and 之类的东西\w
,您可以只使用$USER
and$PWD
来代替,但是对于像\#
或\j
之类的东西可能就不那么容易了。