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.
-