![是否可以在其他地方使用 shell 提示符中使用的转义码,例如 echo?](https://linux22.com/image/193533/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%9C%A8%E5%85%B6%E4%BB%96%E5%9C%B0%E6%96%B9%E4%BD%BF%E7%94%A8%20shell%20%E6%8F%90%E7%A4%BA%E7%AC%A6%E4%B8%AD%E4%BD%BF%E7%94%A8%E7%9A%84%E8%BD%AC%E4%B9%89%E7%A0%81%EF%BC%8C%E4%BE%8B%E5%A6%82%20echo%EF%BC%9F.png)
例子:
当我跑步时
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
之类的东西可能就不那么容易了。