如何设置PS1,让git和conda都能在bash中显示?

How to set PS1 that make both git and conda can show in the bash?

我的.bashrc:

# show a short way
shortwd() {
    num_dirs=3
    pwd_symbol="..."
    newPWD="${PWD/#$HOME/~}"
    if [ $(echo -n $newPWD | awk -F '/' '{print NF}') -gt $num_dirs ]; then
        newPWD=$(echo -n $newPWD | awk -F '/' '{print  "/.../" $(NF-1) "/" $(NF)}')
    fi
    echo -n $newPWD
}
# show git branch
git_branch() {
   git symbolic-ref HEAD --short
}

export PS1='\n$CONDA_PROMPT_MODIFIER\e[38;5;211m$(shortwd)\e[38;5;48m [$(git_branch)]\e[0m$'

现在 bash 看起来像:

(base) /.../MyCode/python [master]$

但是在我 运行 conda activate env 切换我的 conda 环境之后。它有一个错误,无论我 运行 什么命令,总是在命令 output.like 的末尾显示当前的 conda env 名称:

(base) /.../MyCode/python [master]$ls
code_study keras mxnet my_tools other pyqt5 pytorch qt_diankeyuan test windowsCode
(base)

如果我想让 conda env 名称不总是显示在每个命令输出的末尾,我应该怎么做?

我建议让 Conda 自己处理修改 PS1 的部分,而对其他部分使用您自定义的 bash 函数。为此,我会将 PS1 更改为

export PS1='\e[38;5;211m$(shortwd)\e[38;5;48m [$(git_branch)]\e[0m$'

并将其移动到 before 您的 .bashrc 的 Conda 管理部分。接下来,将 Conda 配置变量 env_prompt 设置为您想要的值:

conda config --set env_prompt "\n({default_env}) "

您可以在说明 conda config --describe env_prompt 中阅读有关可模板化变量的更多信息。

唯一偏离您定义的行为的方法是,当没有 envs 处于活动状态时,您将不会获得额外的换行符,但希望您可以接受。另一个缺点是 Conda 只允许前置。


顺便说一句,您的 git_branch 函数将在不在回购中时发送到 stderr,因此您可能希望转移它,以免它进入您的会话。例如,

# show git branch                                                                                                                                      
git_branch() {
    git symbolic-ref HEAD --short 2> /dev/null
}