저는 Fluxbox 창 관리자를 사용하여 Debian 10을 설정하고 있습니다. 나에게 필요한 구성 요소 중 하나는 miniconda입니다. 원래 bash(데스크톱 없음)에서 모든 것을 설치했으며 모든 것이 잘 작동합니다. Miniconda 설치는 내용에 다음 줄을 추가하여 /.bashrc 파일을 변경합니다.
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/opt/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/opt/miniconda3/etc/profile.d/conda.sh" ]; then
. "/opt/miniconda3/etc/profile.d/conda.sh"
else
export PATH="/opt/miniconda3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<
잘 작동합니다. 초기(wm 없음) bash는 $PATH를 올바르게 설정하고 문제 없이 conda를 실행할 수 있으며 echo $PATH
다시 로그인하면 포함된 conda 설치 디렉터리가 그에 따라 표시됩니다.
그러나 Fluxbox에서 xterm을 사용하여 생성된 터미널의 경우 이상한 동작을 발견했습니다.
1) 'conda'를 사용하여 찾으려고 해도 which
대답이 없습니다.
2) echo $PATH
Conda 설치 디렉터리는 표시되지 않습니다.
3) 그러나,conda
여전히 유효, 나는 conda update conda
아무 문제 없이 이것을 할 수 있습니다.
4) 그 후에도 conda 설치 디렉터리는 $PATH에 추가되지 않고 which
여전히 찾을 수 없습니다.
5) conda 환경 활성화를 요청합니다. 예를 들어 conda activate base
정상적으로 작동하면 쉘이 $PATH를 올바르게 업데이트할 수 있습니다.
왜 이런 일이 일어나는지 알고 싶습니다. 이 프로세스에 대해 제가 잘 이해하지 못하는 것이 있습니다. 이 경우 xterm이 생성한 쉘에 환경 변수가 어떻게 전달됩니까? $PATH 에서 찾을 수 없는데도 conda
작동하는 이유는 무엇입니까 ?which
===편집=== 원하는 출력 포함:
root@Zumbi:~# type conda > type_conda_out.txt
conda is a function
conda ()
{
if [ "$#" -lt 1 ]; then
"$CONDA_EXE" $_CE_M $_CE_CONDA;
else
\local cmd="$1";
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
}
root@Zumbi:~# /opt/miniconda3/bin/conda shell.bash hook > hook_out.txt
export CONDA_EXE='/opt/miniconda3/bin/conda'
export _CE_M=''
export _CE_CONDA=''
export CONDA_PYTHON_EXE='/opt/miniconda3/bin/python'
# Copyright (C) 2012 Anaconda, Inc
# SPDX-License-Identifier: BSD-3-Clause
__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_hashr() {
if [ -n "${ZSH_VERSION:+x}" ]; then
\rehash
elif [ -n "${POSH_VERSION:+x}" ]; then
: # pass
else
\hash -r
fi
}
__conda_activate() {
if [ -n "${CONDA_PS1_BACKUP:+x}" ]; then
# Handle transition from shell activated with conda <= 4.3 to a subsequent activation
# after conda updated to >= 4.4. See issue #6173.
PS1="$CONDA_PS1_BACKUP"
\unset CONDA_PS1_BACKUP
fi
\local cmd="$1"
shift
\local ask_conda
CONDA_INTERNAL_OLDPATH="${PATH}"
__add_sys_prefix_to_path
ask_conda="$(PS1="$PS1" "$CONDA_EXE" $_CE_M $_CE_CONDA shell.posix "$cmd" "$@")" || \return $?
rc=$?
PATH="${CONDA_INTERNAL_OLDPATH}"
\eval "$ask_conda"
if [ $rc != 0 ]; then
\export PATH
fi
__conda_hashr
}
__conda_reactivate() {
\local ask_conda
CONDA_INTERNAL_OLDPATH="${PATH}"
__add_sys_prefix_to_path
ask_conda="$(PS1="$PS1" "$CONDA_EXE" $_CE_M $_CE_CONDA shell.posix reactivate)" || \return $?
PATH="${CONDA_INTERNAL_OLDPATH}"
\eval "$ask_conda"
__conda_hashr
}
conda() {
if [ "$#" -lt 1 ]; then
"$CONDA_EXE" $_CE_M $_CE_CONDA
else
\local cmd="$1"
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
}
if [ -z "${CONDA_SHLVL+x}" ]; then
\export CONDA_SHLVL=0
# In dev-mode CONDA_EXE is python.exe and on Windows
# it is in a different relative location to condabin.
if [ -n "${_CE_CONDA+x}" ] && [ -n "${WINDIR+x}" ]; then
PATH="$(\dirname "$CONDA_EXE")/condabin${PATH:+":${PATH}"}"
else
PATH="$(\dirname "$(\dirname "$CONDA_EXE")")/condabin${PATH:+":${PATH}"}"
fi
\export PATH
# We're not allowing PS1 to be unbound. It must at least be set.
# However, we're not exporting it, which can cause problems when starting a second shell
# via a first shell (i.e. starting zsh from bash).
if [ -z "${PS1+x}" ]; then
PS1=
fi
fi
root@Zumbi:~# type -f conda
bash: type: conda: not found
===편집 2=== 이제 FB의 메뉴를 편집할 때 xterm이 어떻게 호출되는지 볼 수 있습니다. 이는 래퍼에 의해 수행되며
x-terminal-emulator -T "Bash" -e /bin/bash --login
옵션 --login
은 다음에 설명되어 있습니다 .배쉬 문서,
Bash가 로그인 셸로 호출된 것처럼 동작하도록 만들기
그래서 bash가 $PATH를 얻지 못하는 이유를 설명합니다. 결과는 bash에서 사용되며 fbrun xterm
시스템 $PATH는 예상대로 초기화됩니다.
답변1
이 명령을 실행하면 conda
쉘 초기화 중에 쉘 함수로 정의되므로 작동합니다. 함수에는 바이너리에 대한 전체 경로가 포함되어 있으므로 $PATH
.
which
셸 기능을 표시하지 않습니다(기본적으로).