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

joh*_*ase 6 prompt terminal python

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

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

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

这将返回我希望被胡萝卜包围的环境名称,但是这仅在我运行后才有效,source .bash_profile激活环境没有效果,这并不意外。

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

这与这个问题有关

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

fil*_*den 6

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

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

所以这应该有效:

PS1+="\[${cyan}\]<\$(basename \$CONDA_DEFAULT_ENV)> ";
Run Code Online (Sandbox Code Playgroud)

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

PS1+="\[${cyan}\]<\$(basename \"\$CONDA_DEFAULT_ENV)\"> ";
Run Code Online (Sandbox Code Playgroud)

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

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

PS1+="\[${cyan}\]"'<$(basename "$CONDA_DEFAULT_ENV")> ';
Run Code Online (Sandbox Code Playgroud)

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