bashのプロンプトをいい感じにしていい感じの色をつける


zshだとちょー簡単にいい感じにできるみたいだけど、bashでもプロンプトをいい感じにしたいと思った。
最終的にこんな感じにできた。
正常に終了した場合は黄色のゆのっち、エラーがあった場合は赤のゆのっち。

【環境】
macOS Mojave v10.14.4
GNU bash, version 3.2.57

もっとうまく書けると思うけど、見よう見まねであんまり詳しくないので。。。

source ~/.git-prompt.sh

GIT_PS1_SHOWDIRTYSTATE=true
GIT_PS1_SHOWUNTRACKEDFILES=true
GIT_PS1_SHOWSTASHSTATE=true
GIT_PS1_SHOWUPSTREAM="auto"

# define for PS1
black=$'\e[30m' # Black - Regular
red=$'\e[31m' # Red
green=$'\e[32m' # Green
yellow=$'\e[33m' # Yellow
blue=$'\e[34m' # Blue
purple=$'\e[35m' # Purple
cyan=$'\e[36m' # Cyan
white=$'\e[37m' # White
gray=$'\e[90m' # Gray
reset=$'\e[m'

# add new line after the output
function add_line {
  if [[ -z "${PS1_NEWLINE_LOGIN}" ]]; then
    PS1_NEWLINE_LOGIN=true
  else
    printf '\n'
  fi
}
PROMPT_COMMAND='add_line'

function check_result_yunocchi {
  if [ $? -eq 0 ]; then
    face="\001${yellow}\002 ✖╹◡╹✖"
  else
    face="\001${red}\002 xX_Xx"
  fi

  echo -e "${face}\001${reset}\002 < "
}

# output prompt
prefix="\u \[$purple\]\w\[$reset\]\[$cyan\] "'$(__git_ps1 "(%s)")'"\[$reset\]\n"
PS1="${prefix}"'$(check_result_yunocchi)'

ハマったところ

\[色\]でくくる

くくらないと上下キーでのhistory選択したときの表示がバグる。。
友人のターミナルではくくらなくとも発生しなかったらしいので何かしらのバージョン依存の問題みたい

echo -e でのエスケープコード?

ゆのっちを出し分けるところを関数にしてechoしてもうまくエスケープされない問題があった。

\[\]✖╹◡╹✖\[\] <

よくわかってないけど、どうやらecho -e、というよりはreadlineを用いるとき?の非表示文字のシーケンスは\001\002にする必要があるらしい。
大変ハマった。。。
https://superuser.com/questions/301353/escape-non-printing-characters-in-a-function-for-a-bash-prompt