查看一个程序的完整路径,除了可以了解其是否存在及所处的位置,还有更重要的作用:当系统中有多个同名程序安装在不同目录下时,检查程序的完整路径可以帮助我们确认其是否为我们想要执行的那个。在 Linux 系统中,我习惯使用 which
或 whereis
来查看一个命令的完整路径。
1$ which gcc
2/usr/bin/gcc
但有一天,我遇到了一个情况:程序明明可以在 Bash 里执行,但 which
就是找不到它。后来搜索到这条回答
才了解到,对路径中可能带有的一些特殊符号(如常用的 ~
)而言,Bash 会在执行前解析并替换它们;而 which
却不会。因此,若是在 .bashrc 中写入
1export PATH="~/toolchain/bin:$PATH"
那么你的 ~/toolchain/bin/gcc
很可能不会被 which
找到,尽管它可执行。
但故事还没有结束。这条回答
在最后建议使用 type
来替代 which
。其在最后附上的另一条回答
给出了更全面的建议:
- 避免使用
which
,改用command -v
、type
和hash
中的一个。理由如下:- 这些都是 Bash 内置的命令,而
which
是一个外部程序,使用它需要启一个单独的进程。为了这点小事启一个单独的进程太浪费了。 which
是一个单独的程序,在不同的系统中有不同的实现,从而有不同的行为和返回值。- (我个人补充一条,就是本文开头提到的关于符号解析的问题)
- 这些都是 Bash 内置的命令,而
- 如执行环境是
/bin/sh
(即不一定是 Bash),则推荐使用command -v
。相对其他两者,该命令的返回值在 POSIX 规范中有更明确的定义,因此更适合在不同的 Shell 中执行。
更详细的内容可通过上面的链接了解。