Bash機能からPS1を生成する

Bash機能からPS1を生成する

bashコマンドプロンプトにNodeのバージョンを表示したいです。 PS1のこの部分を生成する関数を作成しました。ノードのメジャーバージョンを取得し、数値に基づいて色を指定します。私.bash_profile:

nv_ps1 () {
  nv_re="v([0-9]+)\.[0-9]+\.[0-9]"
  if [[ $($NVM_BIN/node --version) =~ $nv_re ]]; then
    nv_major=${BASH_REMATCH[1]}
    let nv_color=$nv_major+26
    echo "\[\e[${nv_color}m\]$nv_major\[\e[m\]"
  fi
}

export PS1="[\$(nv_ps1) \[\e[36m\]\t\[\e[m\] \W]\\$ "

ただし、関数出力のエスケープシーケンスは評価されず、コマンドプロンプトは次のように表示されます。

[\[\e[34m\]8\[\e[m\] 08:54:58 ~]$ 

どのように動作させることができますか?

答え1

シェルは、コマンドを実行する前にエスケープ文字を評価します。NV_PS1。したがって、このコマンドはエスケープ文字を出力しないでください。文字通り表示されます。 Asciiコード(色)は次のように出力できます。NV_PS1以前に変換したことがあればecho -e十分です。しかし、特に\[\]PS1説明、関数から出力できません。これは無視できますが、近いうちに失望するでしょう。

最も簡単な解決策はですexport PS1="[$(nv_ps1) \[\e[36m\]\t\[\e[m\] \W]\\$ "。したがって、エスケープ文字は次に直接保存されます。PS1ミッション中。
利点:レビューのみありNV_PS1一度、シェルはすべてのプロンプトで分岐しません。
短所:評価のみ可能NV_PS1一度だけ実行すると、ノードが更新されたときに現在開いているシェルプロンプトは表示されません(ただし表示できますsource ~/.bashrc)。

プロンプトを最新の状態に保つには、2つの関数呼び出しを実行してexport PS1="[\[\$(nv_ps1 color)\]\$(nv_ps1 version)\[\e[m\] \[\e[36m\]\t\[\e[m\] \W]\\$ "それを関数に入れる必要があります[[ $1 == color ]] && printf "\e[${nv_color}m" || printf "${nv_major}"

注:

  • PS1をエクスポートする必要はありません。
  • ローカル変数の使用を好む。

    local nv_re="v([0-9]+)\.[0-9]+\.[0-9]"
    local nv_major="${BASH_REMATCH[1]}"
    local nv_color=$((nv_major + 26))
    

答え2

あなたの機能でnv_ps1試してみてくださいecho -e "\033[${nv_color}m${nv_major}\033[0m"。より良いでしょう。

関連情報