To get the absolute pathname of a command, Korn shell users can run whence . bash users have type . On other shells, use which ( 50.8 ) . But those will only show the first directory in your PATH ( 6.4 ) with that command. If you want to find other commands with the same name in other directories, the standard which won't show them to you. (The which on the CD-ROM will - if you use its - a option. So will the bash command type -all .) whereiz will:
%which grep/usr/bin/grep %whereiz grep/usr/bin/grep /usr/5bin/grep
On my system, the /usr/bin directory holds a Berkeley-like version of a command. The /usr/5bin directory holds System V versions. /usr/bin is first in my path, but it's good to know if there's also a System V version. whereiz also lets you see if there are both local and system versions of the same command in your path.
Here's the script. The name ends in a z because many UNIX versions already have a whereis ( 50.5 ) command.
&&  | 
#! /bin/sh # COMMAND THAT TESTS FOR EXECUTABLE FILES... SYSTEM-DEPENDENT: testx="test -x" # REPLACE NULL FIELD IN $PATH WITH A . fixpath="`echo $PATH | sed \ -e 's/^:/.:/' \ -e 's/::/:.:/g' \ -e 's/:$/:./'`" IFS=": " # SET $IFS (COLON, SPACE, TAB) FOR PARSING $PATH for command do where="" # ZERO OUT $where # IF DIRECTORY HAS EXECUTABLE FILE, ADD IT TO LIST: for direc in $fixpath do $testx $direc/$command && where="$where $direc/$command" done case "$where" in ?*) echo $where ;; # IF CONTAINS SOMETHING, OUTPUT IT esac done  | 
|---|
The
 
sed
 (
34.24
)
 command "fixes" your 
PATH
. It replaces a null directory name (
::
 in the middle of the 
PATH
 or a single 
:
 at the start or end of the 
PATH
), which stands for the current directory. The null member is changed to the 
relative pathname for the current directory, a dot (
1.21
)
, so the 
direc
 shell variable in the loop won't be empty. In line 12, the double quotes (
""
) have colon, space, and tab characters between them.
 This sets the 
IFS
 (
35.21
)
 variable to split the "fixed" search path, at the colon 
 characters, into separate directories during the 
for
 loop (
44.16
)
. That's a useful way to handle any colon-separated list.
-