`conda activate` 如何改变 *current* bash 环境?
How does `conda activate` change *current* bash environment?
如果我想通过执行 shell 脚本来改变我当前的 bash env 变量,我需要做 source somecript
,因此 env 设置命令是 运行 在当前 bash 而不是分叉的
conda
本身是一个 python 脚本,通过在命令行上 运行ning conda activate someenv
,bash 本身首先被分叉。如果是这样,为什么在执行这个命令后,我原来的 bash env 变量被设置了?
我试图深入研究 conda 包,但在迷路之前无法找到它是如何完成的...
conda itself is a python script
我不知道你在哪里读到的。 conda
设置为bash函数,大家可以自行验证。在.bashrc
中可以看到调用文件/miniconda3/etc/profile.d/conda.sh
设置conda
命令,如下所示:
conda() {
if [ "$#" -lt 1 ]; then
"$CONDA_EXE" $_CE_M $_CE_CONDA
else
\local cmd=""
shift
case "$cmd" in
activate|deactivate)
__conda_activate "$cmd" "$@"
;;
install|update|upgrade|remove|uninstall)
CONDA_INTERNAL_OLDPATH="${PATH}"
__add_sys_prefix_to_path
"$CONDA_EXE" $_CE_M $_CE_CONDA "$cmd" "$@"
\local t1=$?
PATH="${CONDA_INTERNAL_OLDPATH}"
if [ $t1 = 0 ]; then
__conda_reactivate
else
return $t1
fi
;;
*)
CONDA_INTERNAL_OLDPATH="${PATH}"
__add_sys_prefix_to_path
"$CONDA_EXE" $_CE_M $_CE_CONDA "$cmd" "$@"
\local t1=$?
PATH="${CONDA_INTERNAL_OLDPATH}"
return $t1
;;
esac
fi
}
并调用__add_sys_prefix_to_path
函数修改PATH:
__add_sys_prefix_to_path() {
# In dev-mode CONDA_EXE is python.exe and on Windows
# it is in a different relative location to condabin.
if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
SYSP=$(\dirname "${CONDA_EXE}")
else
SYSP=$(\dirname "${CONDA_EXE}")
SYSP=$(\dirname "${SYSP}")
fi
if [ -n "${WINDIR+x}" ]; then
PATH="${SYSP}/bin:${PATH}"
PATH="${SYSP}/Scripts:${PATH}"
PATH="${SYSP}/Library/bin:${PATH}"
PATH="${SYSP}/Library/usr/bin:${PATH}"
PATH="${SYSP}/Library/mingw-w64/bin:${PATH}"
PATH="${SYSP}:${PATH}"
else
PATH="${SYSP}/bin:${PATH}"
fi
\export PATH
}
所以 conda
不会启动任何子 bash shell,而只是 bash 函数的(系列),它只是就地编辑当前环境变量
如果我想通过执行 shell 脚本来改变我当前的 bash env 变量,我需要做 source somecript
,因此 env 设置命令是 运行 在当前 bash 而不是分叉的
conda
本身是一个 python 脚本,通过在命令行上 运行ning conda activate someenv
,bash 本身首先被分叉。如果是这样,为什么在执行这个命令后,我原来的 bash env 变量被设置了?
我试图深入研究 conda 包,但在迷路之前无法找到它是如何完成的...
conda itself is a python script
我不知道你在哪里读到的。 conda
设置为bash函数,大家可以自行验证。在.bashrc
中可以看到调用文件/miniconda3/etc/profile.d/conda.sh
设置conda
命令,如下所示:
conda() {
if [ "$#" -lt 1 ]; then
"$CONDA_EXE" $_CE_M $_CE_CONDA
else
\local cmd=""
shift
case "$cmd" in
activate|deactivate)
__conda_activate "$cmd" "$@"
;;
install|update|upgrade|remove|uninstall)
CONDA_INTERNAL_OLDPATH="${PATH}"
__add_sys_prefix_to_path
"$CONDA_EXE" $_CE_M $_CE_CONDA "$cmd" "$@"
\local t1=$?
PATH="${CONDA_INTERNAL_OLDPATH}"
if [ $t1 = 0 ]; then
__conda_reactivate
else
return $t1
fi
;;
*)
CONDA_INTERNAL_OLDPATH="${PATH}"
__add_sys_prefix_to_path
"$CONDA_EXE" $_CE_M $_CE_CONDA "$cmd" "$@"
\local t1=$?
PATH="${CONDA_INTERNAL_OLDPATH}"
return $t1
;;
esac
fi
}
并调用__add_sys_prefix_to_path
函数修改PATH:
__add_sys_prefix_to_path() {
# In dev-mode CONDA_EXE is python.exe and on Windows
# it is in a different relative location to condabin.
if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
SYSP=$(\dirname "${CONDA_EXE}")
else
SYSP=$(\dirname "${CONDA_EXE}")
SYSP=$(\dirname "${SYSP}")
fi
if [ -n "${WINDIR+x}" ]; then
PATH="${SYSP}/bin:${PATH}"
PATH="${SYSP}/Scripts:${PATH}"
PATH="${SYSP}/Library/bin:${PATH}"
PATH="${SYSP}/Library/usr/bin:${PATH}"
PATH="${SYSP}/Library/mingw-w64/bin:${PATH}"
PATH="${SYSP}:${PATH}"
else
PATH="${SYSP}/bin:${PATH}"
fi
\export PATH
}
所以 conda
不会启动任何子 bash shell,而只是 bash 函数的(系列),它只是就地编辑当前环境变量