终端写入与 bash 配置文件升级的同一行



我的终端现在在同一行上写入两次。在开始重复该行之前,它也不会走到最后。这是我的.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[33[0;31m]W[33[0m]$(git_prompt)[33[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线的工作原理。

两行

PROMPT_COMMAND=$PROMPT_COMMAND' PS1="${c_path}W${c_reset}$(git_prompt) :> "'
export PS1='n[33[0;31m]W[33[0m]$(git_prompt)[33[0m]:> '

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

解决方法是查看PROMPT_COMMAND并在适当的时候添加这些标记,例如,像这样的东西(未经测试(:

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

解决评论:

  • export会导致将PS1的值放入环境中,因此,例如,如果您运行一个子外壳(启动bash,然后在其中运行bash(,则子外壳可以使用PS1的值。
  • 每次收到提示时,PROMPT_COMMAND都会设置PS1
  • 在命令中,$()分隔命令(例如函数 git_prompt (,同时${}分隔变量(具有值且与命令不同的事物不计算或执行(。

延伸阅读:

  • icewater/dotfiles/gitprompt.sh 将标记添加到函数内部,而不是在赋值中添加到PROMPT_COMMAND
  • 具有 Git 和 ANSI 颜色的动态提示符执行相同的操作

最新更新