joh*_*ase 6 prompt terminal python
我想自定义我的终端提示。通常,当 conda 环境被激活时,环境的名称会被添加到 PS1 字符串之前。我想对此进行更多自定义,但一直无法弄清楚。
如果我添加changeps1: false
到我的.condarc
文件中,则在激活新环境时不会修改终端提示。然后我可以修改我的环境变量,.bash_profile
例如:
PS1+="\[${cyan}\]<$(basename $CONDA_DEFAULT_ENV)> ";
这将返回我希望被胡萝卜包围的环境名称,但是这仅在我运行后才有效,source .bash_profile
激活环境没有效果,这并不意外。
我的问题是如何在激活环境时更新提示,或者有更好的方法吗?
这与这个问题有关
和这个示例配置文件但是,这些并没有直接解决我在激活环境时遇到的提示未更改的问题
这里的问题是您使用双引号并使用直接命令替换,这意味着$(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 以进一步修改它,这也会改变颜色。(我想这就是您的情况,因为每当您获取您的个人资料时,您都会说您所拥有的东西。)