最近,我将我的MacOS更新为Catalina。现在默认的shell是zsh,我可以将它还原为bash,但我想继续。现在,我在想要自定义命令提示符时遇到了一个问题。
在$HOME/.zshenv中我声明;
export ZDOTDIR="$XDG_CONFIG_HOME/zsh"在那个文件夹中,我有.zshrc文件。它包含conda初始化的部分。
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/Users/finn/anaconda3/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/Users/finn/anaconda3/etc/profile.d/conda.sh" ]; then
. "/Users/finn/anaconda3/etc/profile.d/conda.sh"
else
export PATH="/Users/finn/anaconda3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<但更重要的是,我获取了这个prompt.sh文件:
function promptcmd () {
local blue="{33}";
local cyan="{87}";
local orange="{160}";
local pink="{200}";
local white="{15}";
local yellow="{226}";
# Set the terminal title and prompt.
PROMPT=""; # working directory base name
PROMPT+="%B"; # all bold
PROMPT+="%F${pink}%n%f"; # username
PROMPT+="%F${yellow}@%f"; # at
PROMPT+="%F${orange}%M%f"; # hostname
PROMPT+="%F${white} in %f"; # in
PROMPT+="%F${blue}%~%f"; # directory
PROMPT+="%F${white} \$ %f%b";
if [[ $CONDA_DEFAULT_ENV != "base" ]]; then
RPROMPT="%F${cyan}($CONDA_DEFAULT_ENV)%f";
fi;
}
promptcmdPROMPT部分运行得非常好。但是我想在右边显示我的Anaconda环境的部分没有,问题是环境变量读取错误。如果我只在提示符中显示变量(没有if语句),我就会看到它是如何始终保持(base)的,尽管我输入了conda activate my_env,然后输入了echo $CONDA_DEFAULT_ENV并返回了my_env。
.zshrc 不重读环境变量吗?
编辑:
--您只调用
promptcmd一次;您希望定义precmd(或者从promptcmd内部定义的所有promptcmd),以便在每次显示提示符之前重新定义提示符。
切德纳的评价起到了帮助;仅仅通过重命名promptcmd函数,它一开始就起作用了。RPROMPT在我conda activate my_env之前是空的,然后是(my_env)。但随后出现了一些奇怪的行为,我只能向你们展示:

发布于 2020-09-04 14:05:34
在编辑之前,有两个部分缺少了。
我发现了其中的第一个原因,这要感谢chepner的评论,它引用了以下内容:
您只调用
promptcmd一次;您想要定义precmd而不是.以便在每次显示提示符之前重新定义它。
显然有这样的命名约定,它导致我的函数promptcmd在打开一个新的终端窗口时只执行一次。如果将其重命名为precmd,则会为的每个提示符执行它。
然后我在问题的编辑中显示了这个问题。每次激活新的conda时,它都会工作,因为$CONDA_DEFAULT_ENV与base不同,后者导致if子句执行并将RPROMPT设置为"%F${cyan}($CONDA_DEFAULT_ENV)%f"。现在,当我输入conda deactivate和$CONDA_DEFAULT_ENV返回base时,它从未从我提示的右边消失。在我学会了一种更容易调试的方法之后,多亏了user1934428的评论:
--如果您有必要的权限,我将在
/etc/zshenv中的第一个命令处放置一个set -x,因为这是执行的起点。当然,这将影响到所有用户。如果你不想这样做,把它放在你的~/.zshenv顶部。
然后,我很快意识到,$RPROMPT在我的自定义提示函数precmd之前根本没有被重置,这是我天真地总结出来的。因此,解决最后一部分的是在RPROMPT=""之前的一个简单的if,它在$CONDA_DEFAULT_ENV不是base时设置RPROMPT。
发布于 2020-09-02 10:59:55
从zsh手册页面:
...然后从$ZDOTDIR/..zshenv读取命令。……然后,如果shell是交互式的,则从/etc/zshrc读取命令,然后从$ZDOTDIR/.zshrc读取命令。
如果没有设置ZDOTDIR,则使用$HOME。我不知道conda激活是如何工作的,但假设它创建了一个新的zsh子进程是合理的。这个子进程现在已经定义了ZDOTDIR,指向与您的家乡不同的目录,您的$HOME/.zshrc将不会被获取。
https://stackoverflow.com/questions/63703785
复制相似问题