0%

日常解惑-Linux里面的whereis/which/where的用法

之前一直使用的时候我就有疑惑,尤其是where和which,既然这两个明明输出一模一样,那为什么需要两个呢?而且平时也记不住这三个到底谁是谁,基本都是一通操作之后,把三个都打一遍,然后看看有没有自己想要的输出。

首先先来用man来看看这三个命令的官方解释:

1
2
3
which - locate a command
whereis - locate the binary, source, and manual page files for a command
No manual entry for where

可以很明显看到,where它并不是一个命令,而which则是给出对应命令的所在位置,whereis还可以给出对应的源代码文件、帮助文档的所在地。

那么很显然可以想到它其实是zsh为我们提供的一个内建命令,那用type看看好了:

1
2
3
which is a shell builtin
whereis is /usr/bin/whereis
where is a shell builtin

emmmm,这似乎不太对啊,怎么连which也是一个builtin的命令了呢?切成bash再看看:

1
2
3
which is /usr/bin/which
whereis is /usr/bin/whereis
bash: type: where: not found

果然从bash的角度,确实很清楚没问题,就两个命令。而zsh则是把which变成了内置的命令。

那么,zsh为什么要这么做呢?这主要是因为如果使用了系统自带的这个which命令,那么就无法显示一些shell自带的命令了,但是如果把which设置成shell自带的命令,那么就有对应的权限来访问shell的一些东西了。

总结:

  • 如果只是希望知道命令的具体位置,请使用which
  • 如果还想知道命令的源文件的位置,使用whereis
  • zsh特意把which改成了内置的,因为它希望which能做到更多的事情。