为什么 `which` 打印出一个脚本?
Why does `which` print out a script?
which conda
或 which -a conda
打印出 conda.sh
的内容,这是一个选择 conda 可执行文件并运行它的脚本,如下面的 (1)。
我希望which
打印conda的路径。这可能是也可能不是 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=""
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
使用-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
%
之所以在man which
中找不到-p
标志,是因为在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 手册:
which conda
或 which -a conda
打印出 conda.sh
的内容,这是一个选择 conda 可执行文件并运行它的脚本,如下面的 (1)。
我希望which
打印conda的路径。这可能是也可能不是 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=""
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
使用-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
%
之所以在man which
中找不到-p
标志,是因为在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 手册: