哪个命令的输出顺序是什么?

哪个命令的输出顺序是什么?

在 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/gitl紧接着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并且zshwhich内置的。


1 不过,就像您的/usr/bin/which(但与 zsh 的builtin 相反which)一样,它不一定会告诉您 shell 将运行哪个命令,因为它会忽略别名、函数、内置命令甚至$hash可执行文件表。也可以看看为什么不用“哪个”呢?那该用什么呢?

相关内容