如何在终端提示符中修改 conda env 变量?

如何在终端提示符中修改 conda env 变量?

我想自定义我的终端提示。通常,当激活 conda 环境时,环境名称会添加到 PS1 字符串之前。我想对此进行更多定制,但一直无法弄清楚。

如果我添加changeps1: false到我的.condarc文件中,当我激活新环境时,终端提示符不会被修改。然后我可以修改我的环境变量,.bash_profile例如:

PS1+="\[${cyan}\]<$(basename $CONDA_DEFAULT_ENV)> ";

这将返回环境的名称,其颜色与我想要的被胡萝卜包围的颜色相同,但这仅在我运行source .bash_profile激活环境后才起作用,没有任何效果,这并不意外。

我的问题是如何在激活环境时更新提示,或者是否有更好的方法来解决此问题?

这与这个问题

和这个示例配置文件但是,这些并不能直接解决我在激活环境时遇到的提示未更改的问题

答案1

这里的问题是,您使用双引号并使用直接命令替换,这意味着$(basename $CONDA_DEFAULT_ENV)(因此$CONDA_DEFAULT_ENV) 的值只会在执行该行代码时计算一次,并将逐字合并到 PS1 中细绳。

bash 处理 PS1 的方式,$(...)每次打印提示时都会评估序列,因此您需要做的是以其文字形式保留序列($例如,通过使用反斜杠转义 s),这应该会产生您的结果正在寻找。

所以这应该有效:

PS1+="\[${cyan}\]<\$(basename \$CONDA_DEFAULT_ENV)> ";

或者,更好的是,在变量周围添加双引号,以便命令在有空格、空或未设置时basename继续工作:$CONDA_DEFAULT_ENV

PS1+="\[${cyan}\]<\$(basename \"\$CONDA_DEFAULT_ENV)\"> ";

请注意,我没有 escape ${cyan},因为只评估一次就可以了,因为预计它不会改变......

转义元字符(例如$")在某些时候开始变得繁重,因此在某些时候使用单引号逐字保留字符串可能是更好的选择,所以我们可以这样做。但由于我们仍然想扩展${cyan},所以让我们混合使用双引号和单引号,以最少的转义达到所需的结果:

PS1+="\[${cyan}\]"'<$(basename "$CONDA_DEFAULT_ENV")> ';

您可能仍然遇到将颜色设置为青色而没有在最后重置它的问题...但这应该很容易解决,通过"\[${...}\]"在末尾添加另一个块以及重置格式的代码(不确定您的颜色常量来自哪里)来自,因此请检查这些重置代码。)但在您的特定环境中,这可能不是问题,如果您在 PS1 上附加了更多行以进一步修改它,这些行也会更改颜色。 (我想这就是你的情况,因为你说每当你获取你的个人资料时你所拥有的都是有效的。)

答案2

稍微扩展一下 filbranden 的答案,如果您想在未设置环境时避免使用 <>,您可以执行以下操作:

# CONDA
function parse_conda_env () {
    if [ ! -z "$CONDA_DEFAULT_ENV" ]
    then
        echo "<$(basename "$CONDA_DEFAULT_ENV")> "
    fi
}

# COLORS
BLUE="\[\033[0;34m\]"
RED="\[\033[0;31m\]"
YELLOW="\[\033[0;33m\]"
GREEN="\[\033[0;32m\]"
CYAN="\[\033[0;36m\]"
NO_COLOR="\[\033[0m\]"

PROMPT_DIRTRIM=2
PS1="$CYAN\$(parse_conda_env)$GREEN\h$BLUE:\w$YELLOW\$(parse_git_branch)$NO_COLOR\$ ";

相关内容