为什么Bash提示符(PS1)会附加幽灵命令?

4

我有一些自定义代码可以调整我的提示符,使其显示如下:

(git-branch):~/t/r/u/ncated-dir$

有时候当我在终端中使用箭头键滚动以前的命令时,提示符会捕获 ~6-7 个字符并将其附加到提示符后面。
问题如下所示:
(master):~/p/test$ <scroll up/down through commands here>

变成这样:

(master):~/p/test$ git pus<keep scrolling up/down through commands here>

这会导致一个类似于这样的提示,当我完成时:

(master):~/p/test$ git puscd public/app/css
(master):~/p/t/p/a/css$ 

很明显,它并不会影响或破坏执行,但仍然很烦人。
我的.bash_profile看起来像这样:
source "$HOME/bin/git-prompt.sh"
source "$HOME/bin/truncate.sh"

PS1="\$(git_prompt)" # prints current branch
PS1+="\[$COLOR_WHITE\]:\[$COLOR_BLUE\]\$(truncate)" # directory path
PS1+="\[$COLOR_WHITE\]\$\[$COLOR_RESET\] " # '#' for root, else '$'
export PS1

我认为git-prompt.sh可能是问题所在,因为每当我在.bash_profile中注释掉那一行时,问题就消失了。但我无法弄清楚为什么。它不应该运行(或改变PS1)直到我按下enter。所以我不知道为什么提示符上会出现幽灵命令。

#! /bin/bash

COLOR_RED="\033[1;31m"
COLOR_YELLOW="\033[1;33m"
COLOR_GREEN="\033[1;32m"
export COLOR_GREY="\033[1;90m"
export COLOR_BLUE="\033[1;34m"
export COLOR_WHITE="\033[0;37m"
export COLOR_RESET="\033[0m"

function git_prompt {
  local git_status
  local color
  git_status="$(git status 2> /dev/null)"

  if [[ $git_status =~ "Your branch is ahead of" ]]; then
    color="$COLOR_YELLOW"
  elif [[ $git_status =~ "Changes not staged for commit" ]]; then
    color="$COLOR_RED"
  elif [[ $git_status =~ "Untracked files" ]]; then
    color="$COLOR_RED"
  else
    color="$COLOR_GREEN"
  fi

  local on_branch="On branch ([^${IFS}]*)"
  local on_commit="HEAD detached at ([^${IFS}]*)"
  local info
  if [[ $git_status =~ $on_branch ]]; then
    local branch=${BASH_REMATCH[1]}
    info="($branch)"
  elif [[ $git_status =~ $on_commit ]]; then
    local commit=${BASH_REMATCH[1]}
    info="($commit)"
  else 
    info="local"
  fi

  echo -e "${color}${info}"
}

如果需要,truncate.sh(连同.bash_profilegit-prompt.sh)可以在此 gist中查看。如果最终确定是罪魁祸首,我将编辑代码并加入问题中。但为了简洁起见,我暂时不会提及它。
1个回答

4
Bash 对于您的提示符长度感到困惑。
PS1+="\[$COLOR_WHITE\]\$\[$COLOR_RESET\] 

注意上面的颜色是被\[\]包围的吗?这些标记是用来界定不打印字符的,它们不会移动光标。 git_prompt缺少这些内容。你需要将其拆分为两个函数才能使其正常工作,一个处理颜色,另一个处理信息。例如:
PS1="\[\$(git_color)\]\$(git_info)"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接