为什么我的自定义 bash 提示在浏览历史记录时出现故障

为什么我的自定义 bash 提示在浏览历史记录时出现故障

我已经设置了一个自定义 bash 提示符,这样我就可以看到诸如当前 git 分支、npm 包版本信息、我所在的虚拟环境等内容。但是,当我按向上箭头键浏览历史记录时,提示符故障:

通常情况下是这样的:

在此输入图像描述

但是,当我浏览历史记录时,lambda 符号和命令之间的空格消失了:

在此输入图像描述

它只是有时会发生,我不知道为什么。我想我只是对小空间很挑剔,但在花了很多时间配置我的 bash 提示符之后,我希望它看起来很完美。

这就是我的 .bashrc 的样子。我正在使用 Windows 版的 Git Bash,顺便说一句,如果这有什么区别的话:

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="$(bashPrompt)"'

答案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(当前版本)或类似版本。

相关内容