4

I use the command whereis rm

$ whereis rm
/bin/rm

Then I try which rm

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

The results are different... so which rm will be called when I run a command like rm readme?

  • 4
    type rm is likely to be more reliable than either - since it will show any path that has been cached by the shell – steeldriver Dec 12 '18 at 13:20
  • 1
    What version of Ubuntu are you running? A default installation of Ubuntu will have the command rm contained only in the /bin folder in the path. Everything I am finding for that which command is that it comes from brew installing the coreutils on a Mac. – Terrance Dec 12 '18 at 14:45
  • 1
    Are you using Mac OSX? @user10726006 – Fabby Dec 14 '18 at 8:06
5

This answer on Super User by Denilson Sá Maia may be useful:

which searches your user-specific PATH (which may include some of the locations whereis searches, and may not include others - it might also include some places that whereis doesn't search if you'd added to your PATH).

whereis searches the standard *nix locations for a specified command.

$  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

Basically, whereis searches for "possibly useful" files, while which only searches for executables.

I rarely use whereis. On the other hand, which is very useful, specially in scripts. which is the answer for the following question: Where does this command come from?

$  which ls
/bin/ls

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

According to manual of which:

which returns the pathnames of the files (or links) which would be executed in the current environment, had its arguments been given as commands in a strictly POSIX-conformant shell. It does this by searching the PATH for executable files matching the names of the arguments. It does not canonicalize path names.

According to manual of whereis:

whereis locates the binary, source and manual files for the specified command names. The supplied names are first stripped of leading pathname components and any (single) trailing extension of the form .ext (for example: .c) Prefixes of s. resulting from use of source code control are also dealt with. whereis then attempts to locate the desired program in the standard Linux places, and in the places specified by $PATH and $MANPATH.

So clearly there is a very thin of difference among them. which results include path of executable file while whereis results in binaries and documentation.

For example, consider java:

  • which results in just one path, i.e. path of java executable file

    /usr/bin/java
    
  • whereis results in about paths, i.e. path of java binary, source and manual

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

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.