当 PS1 包含宽 unicode 字符时,Bash 表现得很奇怪

当 PS1 包含宽 unicode 字符时,Bash 表现得很奇怪

我正在尝试自定义 bash 提示符,这是我的 PROMPT_COMMAND

prompt_command() {
  local time="${BLUE}\t${RESET}"
  local user="${GREEN}\u${RESET}"
  local hostname="${GREEN}\H${RESET}"
  local current_dir="${YELLOW}\w${RESET}"

  PS1="⌂ ${time} ${user}@${hostname} ${current_dir} \n ➤ "
}
PROMPT_COMMAND=prompt_command

当我尝试输入某些内容(顺其自然whoami)时,bash 似乎错误地确定了光标的位置。我几乎看不到最后一个(最右边的)符号(i在本例中),即光标与它重叠。

我说“宽”是因为当我用, ,符号之一替换时一切正常。我尝试了另一个箭头$ш这里得到相同的结果。

谁能解释一下发生了什么(或者只是给我“bash兼容”箭头)?

答案1

看来问题有点复杂了。真正的问题是我这样定义颜色:

[ -z "$TPUT" ] && TPUT=tput
RESET="$(     $TPUT sgr0)"    # Reset all attributes
BRIGHT="$(    $TPUT bold)"    # Set “bright” attribute
BLACK="$(     $TPUT setaf 0)" # foreground to color #0 - black
RED="$(       $TPUT setaf 1)" # foreground to color #1 - red
GREEN="$(     $TPUT setaf 2)" # foreground to color #2 - green
YELLOW="$(    $TPUT setaf 3)" # foreground to color #3 - yellow
BLUE="$(      $TPUT setaf 4)" # foreground to color #4 - blue
MAGENTA="$(   $TPUT setaf 5)" # foreground to color #5 - magenta
CYAN="$(      $TPUT setaf 6)" # foreground to color #6 - cyan
WHITE="$(     $TPUT setaf 7)" # foreground to color #7 - white
FGDEFAULT="$( $TPUT setaf 9)" # default foreground color
export RESET BRIGHT BLACK RED GREEN YELLOW BLUE MAGENTA CYAN WHITE FGDEFAULT

但根据这个帖子线条内的所有颜色序列都PS1必须包含在其中\[ \](我什至不认为它与我的情况有关,但我发现了该问题中提到的相同的历史重叠效果)。

所以我改变了我的颜色:

[ -z "$TPUT" ] && TPUT=tput
RESET_ESC="\[$(     $TPUT sgr0)\]"
BRIGHT_ESC="\[$(    $TPUT bold)\]"
BLACK_ESC="\[$(     $TPUT setaf 0)\]"
RED_ESC="\[$(       $TPUT setaf 1)\]"
GREEN_ESC="\[$(     $TPUT setaf 2)\]"
YELLOW_ESC="\[$(    $TPUT setaf 3)\]"
BLUE_ESC="\[$(      $TPUT setaf 4)\]"
MAGENTA_ESC="\[$(   $TPUT setaf 5)\]"
CYAN_ESC="\[$(      $TPUT setaf 6)\]"
WHITE_ESC="\[$(     $TPUT setaf 7)\]"
FGDEFAULT_ESC="\[$( $TPUT setaf 9)\]"

问题(两个问题)都消失了。

相关内容