xtermによって生成されたシェルの$ PATHにはコマンド位置は含まれていませんが、シェルはまだコマンド位置を実行できます。

xtermによって生成されたシェルの$ PATHにはコマンド位置は含まれていませんが、シェルはまだコマンド位置を実行できます。

私はFluxboxウィンドウマネージャを使ってDebian 10を設定しています。私に必要なコンポーネントの1つは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 $PATHConda インストールディレクトリは表示されません。

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シェル機能を表示しません(デフォルトでは)。

関連情報