zsh - 为什么`which`打印出一个脚本?
问题描述
which conda
或 which -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
解决方案
使用-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 手册:
推荐阅读
- dojo - DOJO 下拉菜单和 datetextbox 在打开/关闭对话框几次后突然停止工作
- perl - 当基础数据被修改时,如何防止引用对象发生变化?
- python - 使用 cython 时出现 GCC 问题
- python - Django 迁移 - django.db.migrations.exceptions.NodeNotFoundError
- jsf - JSF 无法将数据传递给 bootsrtap 模式
- automated-tests - 使用 webdriverio 的 waitUntil() 让 webdriverio 等待一个元素?
- javascript - 来自不同项目/域的 webpack 和 vue 异步组件
- java - Java bufferstrategy,图形错误::尚未创建缓冲区
- jboss - Standalone.xml 中的 Jboss 7.1 日志过滤器
- python - 在 int python 中转换 SQLITE 'NoneType