当将ANSI颜色代码放入PS1
时,它们需要用[]
包围,否则提示可能会混淆行的可编辑部分的开始位置。但是,当子命令 ($()
( 打印颜色时,[]
转义总是按字面意思写入提示符...在我的历史记录中,由于命令足够长,提示会变得混乱。
下面是一个示例:
ps1test() {
ps1sub() {
printf '[ 33[32m]Hello![ 33[0m]'
}
PS1='$(ps1sub) $ '
}
预期:
$ ps1test
Hello! $
实际(bash
由 Git for Windows 安装(:
$ ps1test
[]Hello![] $
如何让我的 shell 解释子命令中的[]
转义?
仅解释文本字符串中的[
s。 嵌入式扩展产生的[
则不是。
解决此问题的最简单方法是每次都PROMPT_COMMAND
将PS1
设置为新的文本值:
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) $ '";
}