哪里和哪里有什么区别


16

wherewhichshell命令有什么区别?这里有些例子

 ~  where cc
/usr/bin/cc
/usr/bin/cc
~  which cc
/usr/bin/cc

  ~  which which
which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/usr/bin/which
  ~  which where
/usr/bin/which: no where in (/usr/local/bin:/bin:/usr/bin:/home/bnikhil/bin:/bin)

  ~  where which
which: aliased to alias | /usr/bin/which --tty-only --read-alias --show-dot
 --show-tilde
which: shell built-in command
/usr/bin/which
/usr/bin/which
  ~  where where
where: shell built-in command

在我看来,它们作为内置的shell会做同样的事情,不太确定这与命令有何不同?

Answers:


11

zsh是为数不多的壳(其他的人是一个tcshwhich最初是作为一csh对脚本csh的用户,这也有其局限性,tcsh使之成为内建作为改进)),其中which做了明智的,因为它是一个shell内建的,但不知为何,你或你的OS (通过某个rc文件)将其替换为对系统which命令的调用来替换它,该命令无法可靠地执行任何明智的操作,因为它无法访问shell的实习生,因此不知道该shell如何解释命令名。

在zsh中,所有的whichtypewhence并且where是内置那都是用来了解哪些命令是命令,但有不同的输出。由于历史原因,它们都在那儿,您可以使用whence命令的不同标志来获取所有它们的行为。

您可以通过运行以下命令获取每个操作的详细信息:

info -f zsh --index-search=which

或键入info zsh,然后使用调出索引i,然后输入内置名称(可以使用补全)。

并避免使用/usr/bin/which。有没有壳如今这里 which需要的。正如Timothy所说,请使用您的Shell为此提供的内置函数。大多数POSIX shell都会有type命令,并且您只能用于command -v获取命令的路径(尽管POSIX typecommand -vPOSIX在POSIX中都是可选的(但在Unix中不是,并且在LSB中不再可用),它们在大多数情况下都可用(如果不是全部)可能会遇到类似伯恩的贝壳)。

(顺便说一句,它看起来像/usr/bin出现两次在您$PATH,您可以添加typeset -U path到您~/.zshrc


2
这也出现在先前的问题中。为了扩展这一点,您应该始终使用存在的shell内置命令。因此,在bash中,使用“类型”而不是“哪个”。
Tim B

出色的答案,也感谢您的提示。
nikhil
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.