bash 提示符在向上箭头处混乱

bash 提示符在向上箭头处混乱

我已经通过 tput 使用颜色对我的提示做了一些修改。

现在看起来,当我尝试arrow up在几次移动之后进行查找时,提示被减少了一半,我的意思是:

由此:

PROD [email protected]:~$ vim .bashrc

对此:

PROD mysuer@servegit rebase origin/add_pool

ctrl + c使一切恢复正常。

我发现一些帖子表明这可能是由于缺少转义符的问题造成的,[但是我在这里没有看到问题:

我的代码:

#red for prod, green for lab

COLOUR_RESET=$(tput sgr0)
COLOUR_GREEN=$(tput setaf 2)
COLOUR_BLUE=$(tput setaf 6)
COLOUR_YELLOW=$(tput setaf 3)
COLOUR_RED=$(tput setaf 1)
BOLD=$(tput bold)

if [[ $HOSTNAME =~ .*\.domain.com$ ]]; then
  COLOUR=$COLOUR_RED
  PROMPT_TEXT="PROD"
fi

if [[ $HOSTNAME =~ .*\.lab$ ]]; then
  COLOUR=$COLOUR_BLUE
  PROMPT_TEXT="LAB"
fi


MYPROMPT="$COLOUR$BOLD$PROMPT_TEXT$COLOUR_RESET \[\u@$COLOUR$BOLD$(hostname -f)$COLOUR_RESET:\w\]\$ "

PS1=$MYPROMPT

更新:@KamilMaciorowski 指出了一个类似的问题,尽管它与 tput 颜色无关。

答案1

我的答案别处几乎足够了,您应该将 的输出包装tput在 中\[ \]

几乎足够了,因为你已经\[ \]有了错误的地方;你应该除掉它们。man 1 bash说:

\[
开始一个非打印字符序列,可用于将终端控制序列嵌入到提示符中

\]
结束非打印字符序列

这意味着 eg$(hostname -f)应该在任何 之外\[ \]。因此

  • 从明确定义中删除\[和并将每个替换为;\]MYPROMPT=$(tput …)='\['"$(tput …)"'\]'

或者

  • 只改变MYPROMPT定义。我调整了你原来的定义:

    MYPROMPT="\[$COLOUR$BOLD\]$PROMPT_TEXT\[$COLOUR_RESET\] \u@\[$COLOUR$BOLD\]$(hostname -f)\[$COLOUR_RESET\]:\w\$ "
    # printing                ^^^^^^^^^^^^                 ^^^^                ^^^^^^^^^^^^^^                 ^^^^^^
    # non-pr.   ^^^^^^^^^^^^                ^^^^^^^^^^^^^        ^^^^^^^^^^^^                  ^^^^^^^^^^^^^
    

答案2

最后我不得不放弃这些颜色。

我的最后一个提示是:

if [[ $HOSTNAME =~ .*\.domain.com$ ]]; then
  PROMPT_TEXT="PROD"
  PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]$PROMPT_TEXT\[\033[00m\] \[\033[01;32m\]\u@\H\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
fi

if [[ $HOSTNAME =~ .*\.lab$ ]]; then
  PROMPT_TEXT="LAB"
  PS1='${debian_chroot:+($debian_chroot)}\[\033[01;34m\]$PROMPT_TEXT\[\033[00m\] \[\033[01;32m\]\u@\H\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
fi

相关内容