検索履歴を表示すると、私のカスタムbashプロンプトが失敗するのはなぜですか?

検索履歴を表示すると、私のカスタムbashプロンプトが失敗するのはなぜですか?

私は現在gitブランチ、npmパッケージのバージョン情報、私が持っている仮想環境などを見ることができるようにカスタムbashプロンプトを設定しました。ただし、履歴を参照するために上矢印キーを押すと、プロンプトに欠陥があります。

通常は次のようになります。

ここに画像の説明を入力してください。

ただし、履歴をナビゲートすると、ラムダ記号とコマンドの間のスペースが消えます。

ここに画像の説明を入力してください。

時々このようなことが起こるのになぜそうなのかわかりません。私はちょうど小さなスペースのためにトリッキーだったようだが、bashプロンプトを構成するのに多くの時間を費やした後、それは完璧に見えたかった。

これが私の.bashrcの外観です。違いがある場合は、WindowsバージョンのGit Bash(btw)を使用しています。

bashPrompt() {
SYMBOL="λ"

COUNT=(`find ./ -maxdepth 1 -name "package.json"`)

if [ ${#COUNT[@]} -gt 0 ]; then
    NPM_PACKAGE_INFO="($(node -p -e "require('./package.json').version"))"
else
    NPM_PACKAGE_INFO=""
fi

if [ ! -z "$CONDA_DEFAULT_ENV" ]; then
    ENV=" ($CONDA_DEFAULT_ENV)"
else
    ENV=""
fi

if [ -d .git ]; then
    if [ -z "$(git status --porcelain)" ]; then 
        echo "[\[\e[0;36;40m\u@\H\]\[\e[0;37;40m]\]\[\e[1;34;40m${ENV}\] \[\e[1;31;40m\w\]\[\e[1;32;40m$(__git_ps1)\] \[\e[0;37;40m${NPM_PACKAGE_INFO}\]\n\[\e[0;37;40m${SYMBOL}\] "
    else 
        echo "[\[\e[0;36;40m\u@\H\]\[\e[0;37;40m]\]\[\e[1;34;40m${ENV}\] \[\e[1;31;40m\w\]\[\e[1;33;40m$(__git_ps1)\] \[\e[0;37;40m${NPM_PACKAGE_INFO}\]\n\[\e[0;37;40m${SYMBOL}\] "
    fi
else
    echo "[\[\e[0;36;40m\u@\H\]\[\e[0;37;40m]\]\[\e[1;34;40m${ENV}\] \[\e[1;31;40m\w\] \[\e[0;37;40m${NPM_PACKAGE_INFO}\]\n\[\e[0;37;40m${SYMBOL}\] "
fi;

}

PROMPT_COMMAND='PS1="$(bashプロンプト)"'

答え1

文字列の1つは次のとおりです。

"[\[\e[0;36;40m\u@\H\]\[\e[0;37;40m]\]\[\e[1;34;40m${ENV}\] \[\e[1;31;40m\w\]\[\e[1;32;40m$(__git_ps1)\] \[\e[0;37;40m${NPM_PACKAGE_INFO}\]\n\[\e[0;37;40m${SYMBOL}\] "

\[\]各テキストをペアで含めます。改行文字を削除し\nてPS1を使ってみると次のようになります。

PS1="[\[\e[0;36;40m\u@\H\]\[\e[0;37;40m]\]\[\e[1;34;40m${ENV}\] \[\e[1;31;40m\w\]\[\e[1;32;40m$(__git_ps1)\] \[\e[0;37;40m${NPM_PACKAGE_INFO}\] n\[\e[0;37;40m${SYMBOL}\] "

上キー(上矢印)を押すと、ほとんどのプロンプトが履歴コマンドに置き換えられます。

行間隔を使用するテキストを括弧の外に配置します。

PS1="[\[\e[0;36;40m\]\u@\H \[\e[0;37;40m]\]\[\e[1;34;40m\]${ENV} \[\e[1;31;40m\]\w\[\e[1;32;40m\]$(__git_ps1) \[\e[0;37;40m\]${NPM_PACKAGE_INFO} n\[\e[0;37;40m\]${SYMBOL} "

それからもう一度やり直してください。

うまくいけば改行文字を追加して\nもう一度やり直してください。

それでも問題がある場合は、bashを4.4.18(現在のバージョン)または同様のバージョンに更新してください。

関連情報