首页 > 解决方案 > 为什么`which`打印出一个脚本?

问题描述

which condawhich -a conda打印出的内容 conda.sh,一个选择 conda 可执行文件并运行它的脚本,如下面的 (1)。

我希望which打印 conda 的路径。这可能是也可能不是 this conda.sh,但无论如何我都不希望看到脚本的内容。

只需conda正确运行即可打印出 conda 的帮助文本,如下 (2) 所示。

PATH开头正确包含 conda 的目录,如 (3) 。

这是 Mac 上的 zsh。

(1)

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
}

(2)

conda
usage: conda [-h] [-V] command ...

conda is a tool for managing and deploying applications, environments and packages.

Options:

positional arguments:
  command
    clean        Remove unused packages and caches.
    compare      Compare packages between conda environments.

...

(3)

/Users/user1/miniconda3/bin:/Users/user1/miniconda3/condabin:/Users/user1/gcloud/google-cloud-sdk/bin:/Users/user1/miniconda3/bin:/usr/local/opt/terraform@0.13/bin:/Users/user1/.krew/bin:/Users/user1/bin:Library/Python/3.7/bin:/Users/user1/bin:/usr/local/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/usr/local/munki:/Library/Apple/usr/bin:/Applications/Wireshark.app/Contents/MacOS:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/local/bin:/Users/user1/executables:/Users/user1/go/bin:/Users/user1/executables/apache-maven-3.6.3/bin:/Users/user1/.local/bin

标签: zsh

解决方案


使用-p标志:

% which pyenv 
pyenv () {
    local command
    command="${1:-}" 
    if [ "$#" -gt 0 ]
    then
        shift
    fi
    case "$command" in
        (rehash | shell) eval "$(pyenv "sh-$command" "$@")" ;;
        (*) command pyenv "$command" "$@" ;;
    esac
}
% which -p pyenv
/usr/local/bin/pyenv
% 

但请注意,在 Zsh 上,您可以使用以下whence命令获得更多信息输出:

% whence -aSv pyenv
pyenv is a shell function from /Users/marlon/.cache/zsh-snap/eval/pyenv-init.zsh
pyenv is /usr/local/bin/pyenv -> /usr/local/bin/../Cellar/pyenv/2.0.0/bin/pyenv -> /usr/local/Cellar/pyenv/2.0.0/bin/../libexec/pyenv
%

在 , 中找不到-p标志的原因man which是因为在 Zsh 中,which是一个等效于的内置命令whence -c

% whence -aSv which
which is a shell builtin
which is /usr/bin/which
%

如果你这样做man which,你会得到外部命令的手册which(在上面输出的第二行)。您可以按如下方式调用后者:

% command which pyenv
/usr/local/bin/pyenv
%

不过, 的输出whence更可靠。外部命令which仅搜索您的$path,其结果可能是也可能不是您在命令行上键入命令时调用的结果。whence -aSv另一方面,它准确地告诉您将调用什么(第一行)以及有哪些替代方法。

有关更多信息,请参阅 Zsh 手册:


推荐阅读