anaconda - .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)
。但随后出现了一些奇怪的行为,我只能向您展示:
解决方案
从 zsh 手册页:
... 然后从 $ZDOTDIR/.zshenv 读取命令。.... 然后,如果 shell 是交互式的,则从 /etc/zshrc 读取命令,然后从 $ZDOTDIR/.zshrc 读取。
如果未设置 ZDOTDIR,$HOME
则使用您的。我不知道 conda 激活是如何工作的,但可以合理地假设它会创建一个新的 zsh 子进程。这个子进程现在已经ZDOTDIR
定义,指向与您的 HOME 不同的目录,并且您$HOME/.zshrc
将不会被获取。
推荐阅读
- python - 如何在 python 上使用 selenium 打开一个新网页?
- c# - 得到错误:'图像
'不包含'DetectHaarCascade'的定义,也没有可访问的扩展方法'DetectHaarCascade' - reference - 如何从 &Vec 中创建 &T 的迭代器
还是 Vec<&T>? - javascript - 获取输出但在 AJAX 中首先获取未定义
- c# - 在未安装 .Net 的 xp 上运行 .Net Framework 应用程序
- samsung-mobile - Note 5 刷 LineageOS 16 和 HyperKernel 后无 SIM 卡、无 WI-FI 和无效 imei
- python - 线性模型:鉴于这两个模型在测试数据集上的表现同样出色,您更喜欢哪一个,为什么?
- javascript - 当 Vue 组件在视口中时,如何添加 body 类?
- reactjs - 在 Formik 中使用 ErrorMessage 组件显示 setFieldErrors 的值
- c# - C#:process.OutputDataReceived 并不总是被触发