终端使用bash配置文件升级在同一行上写入。

时间:2016-02-05 01:48:08

标签: git macos terminal osx-elcapitan .bash-profile

我的终端正在两次写同一行。在开始重复这一行之前,它也没有结束。这是在我的.bash_profile

c_reset="$(tput setaf 2)"
c_path="$(tput setaf 1)"
c_git_dirty="$(tput setaf 1)"
c_git_clean="$(tput setaf 2)"
c_white="$(tput setaf 7)"

PROMPT_COMMAND=$PROMPT_COMMAND' PS1="${c_path}\W${c_reset}$(git_prompt) :> "'

export PS1='\n\[\033[0;31m\]\W\[\033[0m\]$(git_prompt)\[\033[0m\]:> '
git_prompt ()
{
  # Is this a git directory?
  if ! git rev-parse --git-dir > /dev/null 2>&1; then
    return 0
  fi
  # Grab working branch name
  git_branch=$(git branch 2>/dev/null| sed -n '/^\*/s/^\* //p')
  # Clean or dirty branch
  if git diff --quiet 2>/dev/null >&2; then
    git_color="${c_git_clean}"
  else
    git_color=${c_git_dirty}
  fi
   echo "${c_white}[$git_color$git_branch${c_white}]"
}

我得到了这段代码的剂量。但我的问题是它仍然写在同一行。我尝试过这样做的其他方法。使用\ 003 [0; 31m类型命令设置颜色。

我想要做的是告诉我什么时候我的git很脏。现在它在我开始的终端中写入同一行。即使尝试[],它也会这样做。有人可以告诉我如何解决这个问题以及PROMPT_COMMAND的工作原理。

1 个答案:

答案 0 :(得分:1)

两行

PROMPT_COMMAND=$PROMPT_COMMAND' PS1="${c_path}\W${c_reset}$(git_prompt) :> "'

export PS1='\n\[\033[0;31m\]\W\[\033[0m\]$(git_prompt)\[\033[0m\]:> '

足以讨论这个问题:在后者中,\[\]对环绕着您要告诉bash不要在提示的可打印宽度中计算的文本。但是在PROMPT_COMMAND中,您正在使用类似字符串(转义序列)重置PS1 bash不知道的主要是非打印字符。因此bash将这些转义序列中的字符数计为每个字符一列。它对于该行(带有提示和您正在编辑的任何命令)可能有多长时间感到困惑。

修复方法是审核PROMPT_COMMAND并在适当的位置添加这些标记,例如类似的内容(未经测试):

PROMPT_COMMAND=$PROMPT_COMMAND' PS1="${c_path}\W\[${c_reset}$(git_prompt)\] :> "'

发表评论:

  • export会将PS1的值放入环境,例如,如果您运行子shell (启动bash,然后在 内部运行bash,子shell可以使用PS1的值。
  • 每次收到提示时,
  • PROMPT_COMMAND设置PS1
  • 命令中的
  • $()分隔命令(例如函数git_prompt),而${和{{1} } delimit 变量(具有值的东西,与命令不同,不会评估或执行)。

进一步阅读: