为什么我的bash提示符有时会被覆盖?

为什么我的bash提示符有时会被覆盖?,bash,prompt,Bash,Prompt,以下是我的bashrc的相关部分: 它工作得很好,但有时当我为前面的命令键入或点击向上箭头时,提示的一部分会在终端中被覆盖。为什么会发生这种情况?看起来您将$git\u分支部分包含在非打印字符块\[…\]中 看起来您将$git\u分支部分包含在非打印字符块\[…\]中 仅供参考,你应该把最后的\-\\\$增加三倍。另外,您应该切换到zsh。更容易做的事情,大量的预先构建的提示,Git函数等等。@ Kevin You应该考虑把BASH添加到你忽略的标签列表。@ DeNULL,但是我如何找到地方来插

以下是我的bashrc的相关部分:


它工作得很好,但有时当我为前面的命令键入或点击向上箭头时,提示的一部分会在终端中被覆盖。为什么会发生这种情况?

看起来您将$git\u分支部分包含在非打印字符块\[…\]中

看起来您将$git\u分支部分包含在非打印字符块\[…\]中

仅供参考,你应该把最后的\-\\\$增加三倍。另外,您应该切换到zsh。更容易做的事情,大量的预先构建的提示,Git函数等等。@ Kevin You应该考虑把BASH添加到你忽略的标签列表。@ DeNULL,但是我如何找到地方来插入ZSH?@凯文,这是一个好的观点:FYI,你应该把最后的\\\\$加倍。另外,您应该切换到zsh。更容易做的事情,以及大量预先构建的提示,Git函数等等。@ Kevin You应该考虑把BASH添加到你忽略的标签列表中。@ DeNULL,但是我如何找到地方来插入ZSH?@凯文,这是一个很好的观点:
function find_git_branch {
    local dir=. head
    until [ "$dir" -ef / ]; do
        if [ -f "$dir/.git/HEAD" ]; then
            head=$(< "$dir/.git/HEAD")
            if [[ $head == ref:\ refs/heads/* ]]; then
                git_branch=" (${head#*/*/})"
            elif [[ $head != '' ]]; then
                git_branch=' (detached)'
            else
                git_branch=' (unknown)'
            fi
            return
        fi
        dir="../$dir"
    done
    git_branch=''
}

function shortpath {
#  How many characters of the $PWD should be kept
  local pwd_length=40
  local lpwd="${PWD/#$HOME/~}"
  if [ $(echo -n $lpwd | wc -c | tr -d " ") -gt $pwd_length ]
    then newPWD="...$(echo -n $lpwd | sed -e "s/.*\(.\{$pwd_length\}\)/\1/")"
    else newPWD="$(echo -n $lpwd)"
  fi
  echo $newPWD
}

PROMPT_COMMAND="find_git_branch; $PROMPT_COMMAND"

# PS1 prompt color vars
CYAN="\e[36m"
RED="\e[31m"
GREEN="\e[32m"
DEFAULT="\e[0m"
TIME="[\t]"
DIRNAME="\w"

export PS1="\u@\h:\[$CYAN\]\$(shortpath)\[$GREEN\]\[\$git_branch\]\[$DEFAULT\] \$ "