Bashプロンプトの__git_ps1(現在のブランチ)は何とか常に古くなっています。

Bashプロンプトの__git_ps1(現在のブランチ)は何とか常に古くなっています。

PS1私の中に私のもの~/.bash_profile

export PS1="\\n\[\033[38;5;246m\]\u@\[\033[38;5;245m\]\h\[\033[38;5;15m\] \[\033[38;5;28m\]\w\[\033[38;5;15m\]\[\033[38;5;2m\]`__git_ps1`\[\033[38;5;15m\] \[\033[38;5;90m\]\t\[\033[38;5;15m\] \[\033[38;5;232m\]\[\033[38;5;15m\] \n\[\033[38;5;0m\]\\$ "

(申し訳ありませんが、私のカラーコードにエイリアスはありません。このヒントはオンラインエディタを使用して作成しました。)

これは少し混乱しますが、非常に良いヒントを提供します。ここに画像の説明を入力してください。

しかし、切り替えると、現在表示されているブランチは常に間違っています。

間違ったポイント

なぜこれが起こるのかわかりません。コマンドのみを実行すると正しい値が得られます。

$ echo `__git_ps1`
(dev)

.bash_profileを取得すると、新しい値が表示されます(ただし、次回の切り替え時にエラーが発生します)。私は何が間違っていましたか?

ベストアンサー1

export PS1="…`__git_ps1`…"

`__git_ps1`このコマンドは内部二重引用符を使用してコマンドを実行し__git_ps1、その出力(およびその他の周辺テキスト)を変数に割り当てますPS1。したがって、プロンプトには、.bash_profile実行時に決定された分岐が表示されます。

__git_ps1Bashがプロンプトを表示するたびにこのタスクを実行する必要があります。 (実際にgit情報が変わるまで再度実行する必要はありませんが、検出するのは難しいです。)これを行うには2つの方法があります。

  • `__git_ps1`変数にリテラルテキストを含めますPS1。以下を使用して、プロンプト文字列のシェル拡張を実行するように bash が構成されていることを確認します。promptvarsオプションオンはデフォルトで設定されていますが、を使用してオフにすることができますshopt -u promptvars

    PS1='\n\[…\]$(__git_ps1)\[…\]\$ '
    
  • 次のコマンドを実行してプロンプトの内容を更新します。PROMPT_COMMAND変える

    update_PS1 () {
      PS1="\\n\\[…\\]$(__git_ps1)\[…\]\\$ "
    }
    shopt -u promptvars
    PROMPT_COMMAND=update_PS1
    

しかし、プロンプトはグローバル設定ではなくシェル構成なので、~/.bashrc代わりにに設定する必要があります~/.bash_profile

おすすめ記事