我使用命令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