whereis 返回与 which 不同的路径

whereis 返回与 which 不同的路径

我使用命令whereis rm

$ whereis rm
/bin/rm

然后我尝试which rm

$ which rm
/usr/local/opt/coreutils/libexec/gnubin/rm

结果是不同的...那么rm当我运行这样的命令时会调用哪一个rm readme

答案1

超级用户上的这个答案经过德尼尔森·萨玛亚可能有用:

which搜索用户特定的 PATH(可能包括某些位置,但可能不包括其他位置 -whereis如果您已将其添加到 PATH,则还可能包括某些不搜索的位置)。

whereis在标准 *nix 位置中搜索指定的命令。

$  whatis which
which                 (1)  - shows the full path of (shell) commands

$  whatis whereis
whereis              (1)  - locate the binary, source, and manual page files for a command

基本上,whereis搜索“可能有用”的文件,而which仅搜索可执行文件。

我很少使用whereis。另一方面,which非常有用,特别是在脚本中。which是以下问题的答案:这个命令从哪里来的?

$  which ls
/bin/ls

$  whereis ls
ls: /bin/ls /usr/share/man/man1p/ls.1p.bz2 /usr/share/man/man1/ls.1.bz2

答案2

根据手册which

如果其参数在严格符合 POSIX 规范的 shell 中作为命令给出,则返回将在当前环境中执行的文件(或链接)的路径名。它通过在 PATH 中搜索与参数名称匹配的可执行文件来实现此目的。它不会规范化路径名。

根据手册whereis

whereis 查找指定命令名的二进制文件、源文件和手册文件。首先从提供的名称中删除前导路径名组件和任何(单个)尾随扩展名(形式为 .ext)(例如:.c),还会处理因使用源代码控制而产生的 s. 前缀。然后,whereis 尝试在标准 Linux 位置以及 $PATH 和 $MANPATH 指定的位置查找所需的程序。

因此显然它们之间只有很小的差别。which结果包括可执行文件的路径,而whereis结果包括二进制文件和文档。

例如,考虑 java:

  • which结果只有一个路径,即java可执行文件的路径

    /usr/bin/java
    
  • whereis结果是关于路径,即 Java 二进制文件、源代码和手册的路径

    java: /usr/bin/java /usr/share/java /usr/share/man/man1/java.1.gz
    

相关内容