我需要发出一个bash提示,该提示使用另一个函数返回的数据。我需要提示来支持颜色。
玩具盒:
fx() {
...some processing...
# x is the result of some processing
color=x
echo "\[$(tput setaf ${color})\]${data_from_processing}\[${tput sgr0}\]"
}
PS1='fx'
但是上述解决方案似乎无效。我期望的是指定颜色的“数据”。但是我得到的是\[\]<the correct data>\[\]
。请注意,\]<the correct data\[
是彩色的。
在评估命令替换之前,shell解析PS1
的值(包括识别特殊的转义序列\[
和\]
。
最简单的解决方法是将\[
和\]
替换为Shell会使用的实际字节:
q() { printf '\001%s\002123\001%s\002' "$(tput setaf 1)" "$(tput sgr0)"; }
但是,我建议使用PROMPT_COMMAND
来汇编PS1
的值,而不是嵌入命令替换:
q () { echo "\[$(tput setaf 1)\]123\[$(tput sgr0)\]"; }
make_prompt () {
PS1="$(q):"
}
PROMPT_COMMAND=make_prompt
当然,您可以将q
的定义直接折叠为make_prompt
的定义。请注意,我们不会延迟呼叫q
;立即调用它以创建用于每个提示的PS1
值。