之前一直使用的时候我就有疑惑,尤其是where和which,既然这两个明明输出一模一样,那为什么需要两个呢?而且平时也记不住这三个到底谁是谁,基本都是一通操作之后,把三个都打一遍,然后看看有没有自己想要的输出。
首先先来用man来看看这三个命令的官方解释:
1 | which - locate a command |
可以很明显看到,where它并不是一个命令,而which则是给出对应命令的所在位置,whereis还可以给出对应的源代码文件、帮助文档的所在地。
那么很显然可以想到它其实是zsh为我们提供的一个内建命令,那用type看看好了:
1 | which is a shell builtin |
emmmm,这似乎不太对啊,怎么连which也是一个builtin的命令了呢?切成bash再看看:
1 | which is /usr/bin/which |
果然从bash的角度,确实很清楚没问题,就两个命令。而zsh则是把which变成了内置的命令。
那么,zsh为什么要这么做呢?这主要是因为如果使用了系统自带的这个which命令,那么就无法显示一些shell自带的命令了,但是如果把which设置成shell自带的命令,那么就有对应的权限来访问shell的一些东西了。
总结:
- 如果只是希望知道命令的具体位置,请使用
which。 - 如果还想知道命令的源文件的位置,使用
whereis。 - zsh特意把which改成了内置的,因为它希望which能做到更多的事情。