使用打印颜色的子命令设置 PS1



当将ANSI颜色代码放入PS1时,它们需要用[]包围,否则提示可能会混淆行的可编辑部分的开始位置。但是,当子命令 ($()( 打印颜色时,[]转义总是按字面意思写入提示符...在我的历史记录中,由于命令足够长,提示会变得混乱。

下面是一个示例:

ps1test() {
ps1sub() {
printf '[33[32m]Hello![33[0m]'
}
PS1='$(ps1sub) $ '
}

预期:

$ ps1test
Hello! $

实际(bash由 Git for Windows 安装(:

$ ps1test
[]Hello![] $

如何让我的 shell 解释子命令中的[]转义?

仅解释文本字符串中的[s。 嵌入式扩展产生的[则不是。

解决此问题的最简单方法是每次都PROMPT_COMMANDPS1设置为新的文本值:

updateps1() {
ps1sub() {
printf '[33[32m]Hello $RANDOM![33[0m]'
}
PS1="$(ps1sub) \$ "
}
PROMPT_COMMAND='updateps1'

如果您尝试创建动态提示,则可能会更轻松地通过调用为PROMPT_COMMAND的函数来设置PS1值,例如:

ps1test() {
ps1sub() {
printf '[33[32m]Hello![33[0m]'
}
PS1="$(ps1sub)"' $ ' # notice the double-quote
}
PROMPT_COMMAND=ps1test

这对我来说Hello! $正确呈现。

我使用 prompt.gem 来呈现我的提示,你可以看看它是如何配置PROMPT_COMMAND以获得一些灵感。

这是eval的正确用例:

ps1test() {  
ps1sub() {  
printf '[33[31m]Hello![33[0m]';     
};  
eval PS1="'$(ps1sub) $ '"; 
}

最新更新