Bash 使用打印颜色的子命令设置PS1
将ANSI颜色代码放入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
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)\$”
但更脆弱