提示下的Bash完成已与当前PS1断开

提示下的Bash完成已与当前PS1断开,bash,prompt,Bash,Prompt,我认为我在PS1中转义序列的方式有问题。事实上,我知道这就是问题所在。我的问题是,我没有正确地逃避什么 declare __host='\[\e[30;102m\] \h \[\e[0m\]'; declare __dir='\[\e[1;97;44m\] \w \[\e[22m\]'; declare __arrow='\[\e[1m\]▸ \[\e[0m\]'; function __git_status() { local info; info=$(__git_info);

我认为我在
PS1
中转义序列的方式有问题。事实上,我知道这就是问题所在。我的问题是,我没有正确地逃避什么

declare __host='\[\e[30;102m\] \h \[\e[0m\]';
declare __dir='\[\e[1;97;44m\] \w \[\e[22m\]';
declare __arrow='\[\e[1m\]▸ \[\e[0m\]';

function __git_status() {
  local info;
  info=$(__git_info);

  [[ $? -eq 0 ]] && printf "\e[30;43m%s" "$info";
}

export PS1="$__host$__dir"'$(__git_status)'"$__arrow ";

诀窍是根据箭头前面是
\uuuu dir
还是
\uuu git\u status
为箭头上色。这样:

printf中的转义码缺少
\[
\]
包装

切题地说,我还将排除与
$?
函数
关键字的无用的显式比较

__git_status() {
  local info
  info=$(__git_info) &&
    printf '\\[\e[30;43m\\]%s' "$info"
}
还请注意格式字符串周围的单引号和双反斜杠(详细信息请参见注释;感谢Charles Duffy的指导)


Shell脚本在语句之间需要分号或换行符,您不需要两者都用。

谢谢您的要点。您的问题的答案似乎是
printf
不想知道非打印字符上的
\[\]
转义

__git_status() {
  local info
  info=$(__git_info) &&
    printf '\e[30;43m%s' "$info"
}

在设置PS1时非常适合我,并且在确定提示长度时不会有问题。我唯一的问题是CentOS不知道如何打印
=(

解决方案是更改:

info=$(\u git\u info)和&printf'\e[30;4300万%s'$info”

info=$(\uu git\u info)和&printf'\1\e[30;43m\2%s'$info'


这是因为bash在内部替换了提示特殊字符[和]在我的uuu git_ustatus函数执行之前使用ASCII 1和2。

我已经尝试过了。然后在我的PS1中它看起来是这样的:链接似乎断了。但是我猜
printf
也会吃掉一层反斜杠;更新的答案。确实是这样,但你要确保反斜杠在
prin的所有过程中都会加倍tf
(理想情况下不依赖后备行为,因为以下字符不是定义良好的序列的后半部分而无法识别潜在的转义序列).使用双引号会弄乱局面--读者需要考虑两个扩展阶段以及它们之间的相互作用,而在单引号中反斜杠肯定是文字。的确,谢谢;更新为单引号。我认为这也行不通:顺便说一下,一般来说,你不应该动态导出-生成的PS1;子进程Shell将无法访问控制它的元数据。请参阅re:the
function
关键字。嘿,你能在什么地方发布你是如何获得
\uu git\u info
的吗?我很好奇,如果可以的话,我想把它添加到我的
bashrc
中。@jeremysprofile在这里!这不会产生预期的结果hough。我想保留上一个块中的颜色,以便在箭头部分使用。您所做的是在末尾转义序列,因此现在箭头不知道上一个颜色…为什么不使用
\[\e[1;97;44m\]将箭头颜色设置为与dir颜色相同
而不是您当前拥有的?
\uuuuuu dir
具有蓝色背景。
\uuuuu git\u status
具有黄色背景。如果在git回购中,则箭头应具有黄色背景以匹配
\uuu git\u status
(如OP中的屏幕截图)但是,如果我没有参与git回购,那么箭头的背景应该使用
\uu dir
中的蓝色;哦……如果你只是取出
\e[m
(我编辑了我的答案)对我来说是这样的。好吧,那么,使用它,然后打开你的bash提示符,进入历史记录查看以前的命令。你会觉得奇怪吗?比如,历史记录中的命令不能像这样正确显示?在git repo中会发生这种情况。