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.