如何设置PS1使git和conda都可以在bash中显示?

Cap*_*ama 6 git bash ps1 anaconda

我的.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 $1 "/.../" $(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$'
Run Code Online (Sandbox Code Playgroud)

现在 bash 看起来像:

(基础)/.../MyCode/python [master]$

但在我跑去conda activate env切换我的 conda 环境之后。它有一个 BUG,无论我运行什么命令,总是在命令输出的末尾显示当前的 conda env 名称。如下所示:

(基础) /.../MyCode/python [master]$ls
code_study keras mxnet my_tools 其他 pyqt5 pytorch qt_diankeyuan 测试 windowsCode
(基础)

在此输入图像描述

如果我想让 conda 环境名称不总是显示在每个命令输出的末尾,我该怎么办? 在此输入图像描述

mer*_*erv 7

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

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

并将其移至.bashrc. 接下来,将 Conda 配置变量设置env_prompt为您想要的内容:

conda config --set env_prompt "\n({default_env}) "
Run Code Online (Sandbox Code Playgroud)

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

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


顺便说一句,您的git_branch函数将在不在存储库中时发出stderr,因此您可能需要转移它,这样它就不会影响您的会话。例如,

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

  • @rkedge,我的 `~/.bashrc` 的相关部分以 `# >>> conda initialize >>>` 开头,并且很快就会在某个地方有 `__conda_setup` 。它以“# <<< conda初始化<<<”结尾。当我将其移到 `~/.bashrc` 中的任何 `PS1` 内容之后时,它解决了我在使用 `$PS1` 时遇到的问题。您可能想查看“~/.bash_profile”、“~/.bash_login”,甚至可能是“~/.profile”或“~/.login”之类的内容。如果那里没有任何内容,您可能需要查看“/etc/”,例如“/etc/bashrc”或“/etc/profile”。`PS1` 的东西应该在 `~/.bashrc` 中(也许在 `/etc/bashrc` 中,但感觉不太正确)。 (2认同)