使用函数的彩色 bash 提示

coloured bash prompt which uses a function

我需要制作一个 bash 提示,该提示使用另一个函数返回的数据。我需要提示支持颜色

玩具箱:

fx() {
...some processing...
# x is the result of some processing
color=x
echo "\[$(tput setaf ${color})\]${data_from_processing}\[${tput sgr0}\]"
}
PS1='fx'

但是上面的解决办法好像不行。我期望的是指定颜色的 'data'。但是我得到的是\[\]<the correct data>\[\]。需要注意的是\]<the correct data\[是彩色的

shell 在计算命令替换之前解析 PS1 的值(包括识别特殊转义序列 \[\])。

最简单的解决方法是将 \[\] 替换为 shell 的实际字节数:

q() { printf '[=10=]1%s[=10=]2123[=10=]1%s[=10=]2' "$(tput setaf 1)" "$(tput sgr0)"; }

但是,我建议使用 PROMPT_COMMAND 来 assemble PS1 的值,而不是嵌入命令替换:

q () { echo "\[$(tput setaf 1)\]123\[$(tput sgr0)\]"; }

make_prompt () {
  PS1="$(q):"
}
PROMPT_COMMAND=make_prompt

当然你可以把q的定义直接折叠到make_prompt的定义中。请注意,我们不会延迟对 q 的调用;它会立即被调用以创建 PS1 的值以用于每个提示。