What's the difference between
How about learning about
$ 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 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
Quoting their man pages :
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
$ 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? :)