为什么bash提示符(PS1)附加ghost命令?

时间:2017-09-18 16:42:49

标签: bash shell command-prompt

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

(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),直到我按输入。所以我不确定我是如何在提示符下获得幽灵命令的。

#! /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}"
}
如果需要,可以查看{p> truncate.sh(以及.bash_profilegit-prompt.shin this gist。如果事实证明它是罪魁祸首,我会将代码编辑到问题中。但为了简洁和减少噪音,我现在暂时搁置它。

1 个答案:

答案 0 :(得分:3)

Bash对你的提示有多长时间感到困惑。

PS1+="\[$COLOR_WHITE\]\$\[$COLOR_RESET\] 

注意上面的颜色是如何被\[\]包围的?这些标记用于界定不会使光标前进的非打印字符。

git_prompt遗漏了他们。您需要将其拆分为两个功能才能使其正常工作,一个用于颜色,一个用于信息。例如:

PS1="\[\$(git_color)\]\$(git_info)"