我从 Windows 切到 Linux 的头半年,最大的困扰之一就是「我的软件到底在哪」。
在 Windows 里,装完软件桌面会多个快捷方式,开始菜单里也有。想知道它装在哪,右键点一下属性就看到了。
然而,我要是在 Linux 里安个命令行软件,那感觉就像石沉大海,装完之后静悄悄的……
面对那黑洞洞的终端,我内心咆哮:我的软件到底装在哪里了!?这种脱离掌控的感觉真令人抓狂。
忍不了,我就去搜「Linux 怎么找程序安装位置」,发现有 which、whereis、type……我每个都试了下,结果每个给我的答案还不一样。心态崩了,搁这和我玩躲猫猫呢?
我想很多人刚接触 Linux 的时候都会遇到这个问题,尤其对于用惯了 Windows 的人来说,Linux 简直是反人类。
但这种体验,也是刚进 Linux 世界时绕不过的一道坎,跨过以后,就会发现原来觉得反人类的地方,其实是 Linux 别样的风景。
这个问题,其实不是 Linux 找不到,相反,它给了你太多找法,并且每个命令的设计初衷都不一样。
要理解它们的区别,得先回答一个更基础的问题:你问的是「文件系统上哪里有这个程序」,还是「我打一个命令,shell 到底会执行哪个」?
如果你问的是前者,那么这是 whereis 的事。它的搜索范围是预设的系统目录加上 $PATH,因此它不光搜可执行文件,还会把 man 手册也翻出来。
$ whereis lsls: /usr/bin/ls /usr/share/man/man1/ls.1.gz这有点像在 Windows 里右键查看「打开文件所在位置」——只不过它给的不只是程序位置,还捎上了手册。
但如果你真正想问的是「我打一个命令,shell 到底会执行哪个」,那 whereis 回答不了这个问题。因为 shell 的查找过程是另一套逻辑——alias、函数、内置命令、缓存路径。

这时候该用 type。它是 shell 内置命令,它看到的东西就是 shell 实际会去找的。你要找的命令有没有 alias、是不是内置命令、有没有被缓存,它都知道。
$ type lsls is an aliasfor exa$ typeechoecho is a shell builtin如果你还想知道「同一个名字,系统里有没有多个版本」:
$ type -a lsls is an aliasfor exals is /usr/bin/lsls is /bin/ls这比 Windows 的右键属性还直观——它会把 shell 能找到的同名候选按优先级高低一个个列出来。
那 which 呢?很多人接触的第一个找文件命令就是它。
它确实是最常见的快速查询命令。但我把它放到最后讲是因为它只适合快速看一眼。原因是 which 在不同 shell 里的行为不完全一样。Bash 里的 which 主要查 $PATH 里的可执行文件,但是在 Zsh 环境里,which 可以看到 alias。
所以,它有时给出的答案并不是你想要的,而你却察觉不到。

现在我们可以小结一下:
想知道「shell 到底跑哪个」→ type想知道「还有其他版本吗」→ type -a想知道「可执行文件和手册在哪」→ whereis快速瞥一眼 → which
跟 Windows 比,Linux 少了那个「右键 → 属性」的直觉入口,但多了好几个各有所长的替代品。关键不是把它们全记住,而是知道自己问的是哪种问题,然后挑对命令。
推荐:时间砖块小游戏
夜雨聆风