在 bash 中我看到which
按顺序返回路径,但在 zsh 中它有不同的顺序。
我现在主要使用 zsh,如何which
在 zsh 中获得正确的输出排序?为什么不一样呢?我希望顺序符合我的路径。
我的路径是:/usr/local/bin:/usr/bin
bash$ which -a git
/usr/local/bin/git
/usr/bin/git
zsh$ which -a git
/usr/bin/git
/usr/local/bin/git -> ../Cellar/git/2.32.0/bin/git
答案1
你碰巧定义which
为:
which(){
/usr/bin/which -a "$@" |
xargs ls -l |
tr -s ' ' |
cut -d ' ' -f 9-
}
ls
在输出中按词法对文件名进行排序并位于后面,因为/usr/local/bin/git
/usr/bin/git
l
紧接着b
在您的语言环境中。
GNU 实现ls
有一个-U
选项可以禁用该排序。
您的/usr/bin/which
命令似乎是一个打印$PATH
传递选项时找到的所有命令名称的路径的命令-a
。对于zsh
内置函数,您可以使用 ¹ 执行相同的操作whence -pa
。
所以你可以这样做:
mywhich() (
set -o pipefail
zmodload zsh/stat
whence -pa "$@" |
while IFS= read -r f; do
if [[ -L $f ]] && stat -A l +link -- $f; then
print -r -- "$f -> $l"
else
print -r -- $f
fi
done
)
(这里假设所有文件路径都不包含换行符)。
在 GNU 系统上,你的更正确的版本将是这样的:
mywhich() (
set -o pipefail
command which -a "$@" |
xargs -rd '\n' ls -ndU -- |
sed -E 's/([^ ]+ +){8}//'
)
无论如何,请注意它bash
没有which
内置函数,因此which
输出内容与 shell 无关。只有tcsh
并且zsh
有which
内置的。
1 不过,就像您的/usr/bin/which
(但与 zsh 的builtin 相反which
)一样,它不一定会告诉您 shell 将运行哪个命令,因为它会忽略别名、函数、内置命令甚至$hash
可执行文件表。也可以看看为什么不用“哪个”呢?那该用什么呢?