ローカル ファイル システムで有効になっている構成ファイルのバージョンを PS1 で報告する動的な bash プロンプトに取り組んでいます。これは、私がやろうとしていることの単純化された例です。うまくいかないこと: 不適切なラッピングやエスケープ ブラケットの表示。誰かが私が間違っていることを見つけることができますか?
人為的な構成が「v2」と一致する場合、PS1 でそのバージョンを YELLOW として表示したいと考えています。「v1」の場合、プロンプトで GREEN と表示されます。セットアップ:
$ grep FOOVER foo-*.conf
foo-v1.conf:# FOOVER xyz-v1
foo-v2.conf:# FOOVER zet-v2
次に、foo.conf foo-v1.conf をシンボリック リンクします。私のbashrc:
0 GREEN=$(tput setaf 034)
1 YELLOW=$(tput setaf 3)
2 BLUE=$(tput setaf 4)
3 CYAN=$(tput setaf 6)
4 BOLD=$(tput bold)
5 RESET=$(tput sgr0)
6 CONF=$HOME/foo.conf
7
8 function __get_foo_version () {
9 FOOVER=$(grep FOOVER $CONF | awk '{print $3}')
10 if [[ "$FOOVER" =~ v2$ ]]; then
11 style_foover="${BOLD}${YELLOW}$FOOVER"
12 #style_foover="\[${BOLD}${YELLOW}\]$FOOVER"
13 elif [[ "$FOOVER" =~ v1$ ]]; then
14 style_foover="${BOLD}${GREEN}$FOOVER"
15 #style_foover="\[${BOLD}${GREEN}\]$FOOVER"
16 fi
17 echo $style_foover
18 }
19
20 style_host="\[${RESET}${BLUE}\]"
21 style_path="\[${RESET}${CYAN}\]"
22 style_reset="\[${RESET}\]"
23
24 PS1='user@'
25 PS1+="${style_host}host"
26 PS1+="${style_reset} "
27 PS1+="\$(__get_foo_version) "
28 PS1+="${style_reset}"
29 PS1+="${style_path}\W"
30 PS1+="${style_reset} $ "
上記を実行すると、最初は良さそうなこの動作が得られます: http://imgur.com/HIR3SoA
しかし、長いコマンドに上向き矢印を付けると、悪いラッピングが発生します: http://imgur.com/qLfdUor
11 行目、14 行目を無効にし、12 行目、15 行目を有効にすると、PS1 に表示される非印刷文字を処理するためのブラケットが取得されます。
(2 つ以上のリンクを投稿するのに十分な評判ポイントがありません :( imgur.com スラッシュ nkXFDyJ)
user@host \[\]xyz-v1 ~ $
..そして、この場合、まだラッピングが悪いです。