我有一个如下所示的 shell 函数:
rebar3 () {
set -o localoptions -o localtraps
trap '/bin/stty sane' INT
command rebar3 "$@"
}
我如何知道在哪里command rebar3
可以找到rebar3
二进制文件?
我尝试过以下方法,但都不起作用:
% which rebar3
rebar3 () {
set -o localoptions -o localtraps
trap '/bin/stty sane' INT
command rebar3 "$@"
}
...没有帮助。
% command -v rebar3
rebar3
...没有帮助。
% command -V rebar3
rebar3 is a shell function from /Users/rogerlipscombe/.zshrc
……我已经知道了。
% command -p rebar3
zsh: command not found: rebar3
...因为二进制文件不在默认路径中。
如何让 zsh 在使用which
or时忽略函数/别名command -v
?
答案1
POSIX 方式在 zsh 中工作:
(unalias rebar3 2>/dev/null; unset -f rebar3 2>/dev/null; command -v rebar3)
显式执行查找的 POSIX 方式PATH
也适用。这里我展示了一种简单的方法,假设$PATH
没有空组件。
(IFS=:; set -f; for p in $PATH; do ls $p/rebar3 2>/dev/null; done)
Zsh 有一种更简单的路径查找方法,这要归功于path
大批和N
全局限定符。
print -lr $path/rebar3(N)
command -v rebar3
或者,从您想要类似or or type rebar3
or的想法开始which rebar3
,查找以下文档command
,type
或者which rebar3
,所有这些都表明这些是围绕whence
内置。这将引导您
whence -p rebar3
仅显示外部命令,或其中之一
whence -a rebar3
type -a rebar3
显示所有内容(别名、函数、内置外部命令)。which -a rebar3
也可以,但它显示函数代码,这会分散注意力。
答案2
我在这里找到了答案:https://stackoverflow.com/a/14196212/8446
在 ZSH 中,
which
相当于whence -c
(显示函数的定义),而不是whence -p
(告诉可执行路径)。如果您想更改它,请创建一个别名。
% whence -p rebar3
/opt/homebrew/bin/rebar3