首页 > 解决方案 > .zshrc 文件中的环境变量读取不正确

问题描述

最近我将我的 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;
}

promptcmd

PROMPT部分工作得很好。但是我想在右侧显示我的Anaconda 环境的部分,它没有。问题是环境变量$CONDA_DEFAULT_ENV读取不正确。如果我只是在提示中显示变量(没有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)。但随后出现了一些奇怪的行为,我只能向您展示:

示例终端输出

标签: anacondaenvironment-variableszshcommand-promptzshrc

解决方案


从 zsh 手册页:

... 然后从 $ZDOTDIR/.zshenv 读取命令。.... 然后,如果 shell 是交互式的,则从 /etc/zshrc 读取命令,然后从 $ZDOTDIR/.zshrc 读取。

如果未设置 ZDOTDIR,$HOME则使用您的。我不知道 conda 激活是如何工作的,但可以合理地假设它会创建一个新的 zsh 子进程。这个子进程现在已经ZDOTDIR定义,指向与您的 HOME 不同的目录,并且您$HOME/.zshrc将不会被获取。


推荐阅读