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

Bash 使用打印颜色的子命令设置PS1,bash,sh,prompt,git-bash,Bash,Sh,Prompt,Git Bash,将ANSI颜色代码放入PS1时,需要用\[\]包围它们,否则提示可能会混淆行的可编辑部分的起始位置。但是,当一个子命令($())打印颜色时,\[\]转义符总是被逐字写入提示符中……并且由于我的历史记录中有足够长的命令,提示符会变得混乱 下面是一个例子: ps1test() { ps1sub() { printf '\[\033[32m\]Hello!\[\033[0m\]' } PS1='$(ps1sub) \$ ' } 预期: $ ps1test He

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

下面是一个例子:

ps1test() {
    ps1sub() {
        printf '\[\033[32m\]Hello!\[\033[0m\]'
    }
    PS1='$(ps1sub) \$ '
}
预期:

$ ps1test
Hello! $
实际(
bash
由Git for Windows安装):


如何让shell解释从子命令转义的
\[\]
语句?

只解释文本字符串中的
\[
语句。由嵌入式扩展生成的
\[
语句不会被解释

最简单的解决方法是让
PROMPT_命令
每次将
PS1
设置为一个新的文本值:

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

PROMPT_COMMAND='updateps1'

只解释文本字符串中的
\[
s。不解释嵌入扩展产生的
\[
s

最简单的解决方法是让
PROMPT_命令
每次将
PS1
设置为一个新的文本值:

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

PROMPT_COMMAND='updateps1'

如果您试图创建动态提示,则可以通过作为
prompt\u命令调用的函数轻松设置
PS1
值,例如:

ps1test() {
  ps1sub() {
        printf '\[\033[32m\]Hello!\[\033[0m\]'
    }
    PS1="$(ps1sub)"' \$ ' # notice the double-quote
}
PROMPT_COMMAND=ps1test
这对我来说正确地呈现为
Hello!$


我用它来呈现提示,你可以看看它是如何产生灵感的。

如果你试图创建一个动态提示,你可能会更容易通过一个作为
prompt\u命令调用的函数来设置
PS1
值,例如:

ps1test() {
  ps1sub() {
        printf '\[\033[32m\]Hello!\[\033[0m\]'
    }
    PS1="$(ps1sub)"' \$ ' # notice the double-quote
}
PROMPT_COMMAND=ps1test
这对我来说正确地呈现为
Hello!$


我用它来显示我的提示,你可以看看它是如何产生灵感的。

这正是
eval
的正确用例:

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

这正是
eval
的正确用例:

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

与使用原始颜色代码相比,使用
tput
要干净得多。cleaner是的,但是对
tput
调用太多会显著降低shell的速度。至少在Windows上是这样。但无论如何,问题中的颜色代码只是一个示例。与使用原始颜色代码相比,使用
tput
要干净得多。cleaner是的,but对
tput
的调用太多会显著降低shell的速度。至少在Windows上是这样。但无论如何,问题中的颜色代码只是一个例子。前提是
ps1sub
的结果不会因上下文而改变。在这种情况下,它相当于
PS1=“$(ps1sub)\$”
但如果
ps1sub
的结果不随上下文变化,则更脆弱。在这种情况下,它相当于
PS1=“$(ps1sub)\$”
但更脆弱