“命令”在哪里可以找到我的命令?

“命令”在哪里可以找到我的命令?

我有一个如下所示的 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 在使用whichor时忽略函数/别名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 rebar3or的想法开始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

相关内容