What's the difference between which
and whereis
?
5 Answers
How about learning about whereis
and which
using whatis
?
$ 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
-
1There's more to it than that. On my system, whereis and which return different executable paths. I can only get the path to the one that actually runs with
whereis
, not the one forwhich
. Commented Aug 21, 2016 at 22:25 -
1@JordanReiter: It can't be!
which
shows the actual path. Are you sure the path pointed bywhich
isn't just a symlink to the path pointed bywhereis
? Maybe it is a shell alias. In bash, try runningtype your_cmd_here
. Commented Aug 22, 2016 at 0:01 -
@DenilsonSá unfortunately I can't recreate the situation but when I run into it again I'll provide more details. Commented Sep 1, 2016 at 18:14
-
@DenilsonSáMaia, I get the same thing.
$ type xcodebuild --> xcodebuild is hashed (/usr/local/bin/xcodebuild) $ which xcodebuild --> /usr/local/bin/xcodebuild $ whereis xcodebuild --> /usr/bin/xcodebuild
And runningxcodebuild
always picks the wrong one (i.e., the/usr/bin
command) even though/usr/local/bin
has higher$PATH
priority. Commented May 30, 2018 at 21:32 -
I have mutliple python installations. Some in
/usr/bin/python2.7
, some in/usr/local/lib/python3.4
.whereis python
finds them both which is a great way to list all python versions installed Commented Aug 24, 2019 at 13:45
whereis
searches the standard *nix locations for a specified command.
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)
-
3Unix, Linux etc. (Mac OS X belonging in the etc.)– TomCommented Sep 12, 2009 at 20:23
-
Nope. Just a fairly common convention of creative wildcard use to refer to a family of similar operating systems. ;)– DavCommented Sep 12, 2009 at 22:28
-
Yes! For a good example, compare:
PATH='' /usr/bin/which vim
vsPATH='' /usr/bin/whereis vim
. Thewhereis
command still locates the executable, even if your PATH is empty.– edanCommented Jun 19, 2020 at 18:35
Quoting their man pages :
whereis :
whereis locates source/binary and manuals sections for specified files.
For instance :
$ whereis php
php: /usr/bin/php /usr/share/php /usr/share/man/man1/php.1.gz
ie, the "php" executable, and some other stuff (like man pages).
and which :
which returns the pathnames of the files which would be executed in the current environment
For instance :
$ which php
/usr/bin/php
ie, only the "php" executable.
which search for executables in the directories specified by the environment variable PATH. And if found out, the full pathname of this executable will be printed.
$ which ls
/bin/ls
$ which ifconfig
$ # No output, because ifconfig only exist in root's PATH.
whereis search for executables, source files, and manual pages using a database built by system automatically.
$ whereis less
less: /bin/less /usr/bin/less /usr/bin/X11/less /usr/share/man/man1/less.1.gz
But it seems that whereis and locate don't use the same database. When I installed a software and then used whereis and locate immediately to search for this software. The result is that whereis could find out some files related to this software while locate couldn't. Do they really use different database? How the database work? --Well, how about refuse to be a pedant? :)
-
did you run updatedb command? locate relies on that as far as I remember Commented Feb 2, 2018 at 10:37
Thought I'd share something I learned recently on my Apple MacOS X Mojave; pretty sure it applies to numerous versions of Apple's macOS over the past few years:
On Mojave:
whereis
searches for executables only in the path defined by the stringuser.cs_path
; further defined as:/usr/bin:/bin:/usr/sbin:/sbin
.whereis
displays no information on any system documentation (i.e.man
pages).On some systems,
sysctl
may be used to "set or get kernel state", but Apple has deprecated the-w, --write
option for changinguser.cs_path
usingsysctl
.In effect, Apple has relegated
whereis
to reporting the location of the 10-20 year-old tools they provide to their customers inuser.cs_path
.All of this may make Apple's
whereis
the most useless utility on the planet.
Just in case you're interested :)
type
is superior. It also knows about defined aliases, functions etc