首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >环境变量在.zshrc文件中读取错误

环境变量在.zshrc文件中读取错误
EN

Stack Overflow用户
提问于 2020-09-02 10:37:53
回答 2查看 1K关注 0票数 1

最近,我将我的MacOS更新为Catalina。现在默认的shell是zsh,我可以将它还原为bash,但我想继续。现在,我在想要自定义命令提示符时遇到了一个问题。

$HOME/.zshenv中我声明;

代码语言:javascript
运行
复制
export ZDOTDIR="$XDG_CONFIG_HOME/zsh"

在那个文件夹中,我有.zshrc文件。它包含conda初始化的部分。

代码语言:javascript
运行
复制
# >>> 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文件:

代码语言:javascript
运行
复制
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环境的部分没有,问题是环境变量读取错误。如果我只在提示符中显示变量(没有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)。但随后出现了一些奇怪的行为,我只能向你们展示:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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。

票数 0
EN

Stack Overflow用户

发布于 2020-09-02 10:59:55

从zsh手册页面:

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63703785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档