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)\]"

問題(両方の問題)が消えました。

おすすめ記事