【问题标题】:Terminal writing over the same line with bash profile upgrades.终端写入与 bash 配置文件升级相同的行。
【发布时间】:2016-05-14 21:21:17
【问题描述】:

我的终端现在在同一行上写了两次。在开始重复该行之前它也不会走到尽头。这是在我的 .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 行如何工作。

【问题讨论】:

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


【解决方案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 中,您正在使用bash 不知道的类似字符串(转义序列)重置PS1,这些字符串主要是非打印字符。所以bash 将这些转义序列中的字符数计算为每个字符一列。它对行(带有提示符和您正在编辑的任何命令)可能有多长感到困惑。

解决方法是查看 PROMPT_COMMAND 并在适当的地方添加这些标记,例如,类似这样的内容(未经测试):

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

解决评论:

  • export 导致 PS1 的值被放入 环境,例如,如果您运行 subshel​​l(启动 bash,然后在that中运行bashPS1的值可以被子shell使用。
  • 每次收到提示时,PROMPT_COMMAND 都会设置 PS1
  • 在命令中,$()分隔命令(如函数git_prompt),而${}分隔变量 (具有值且与命令不同的事物不会被评估或执行)。

进一步阅读:

【讨论】:

  • 我对此进行了测试,但它不起作用。我有几个问题。 PROMPT_COMMAND=$PROMPT_COMMAND 'other-stuff' 这是否为自身设置了一个系统变量以及其他一些东西?
  • 也感谢@Thomas。导出 PS1 有什么作用?为什么有些 var 用 {} 包裹,而另一些用 () 包裹?我只了解它的一半是如何工作的。我不想做两篇文章,但我还没准备好就进入了..
猜你喜欢
  • 2022-12-03
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 2013-01-08
  • 2016-03-22
相关资源
最近更新 更多