`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 函数的(系列),它只是就地编辑当前环境变量