Finding a File Using a List of Possible Locations
Problem
You need to execute, source, or read a file, but it may be located in a number of
different places in or outside of the $PATH.
Solution
If you are going to source the file and it’s located somewhere on
the $PATH, just source
it. bash’s built-in source
command (also known by the shorter-to-type but harder-to-read
POSIX name “.”) will search the $PATH
if the sourcepath shell option is
set, which it is by default:
$ source myfile
If you want to execute a file only if you know it exists in the
$PATH and is executable, and you have
bash version 2.05b or higher, use type -P to search the $PATH. Unlike the which
command, type -P only produces output
when it finds the file, which makes it much easier to use in this
case:
LS=$(type -P ls) [ -x $LS ] && $LS # --OR-- LS=$(type -P ls) if [ -x $LS ]; then : commands involving $LS here fi
If you need to look in a variety of locations, possibly including
the $PATH, use a for loop. To search
the $PATH, use the variable
substitution operator ${variable/pattern/
replacement} to replace the : separator with a space, and then
use for as usual. To search the $PATH
and other possible locations, just list them:
for path in ${PATH//:/ }; do
[ -x "$path/ls" ] && $path/ls
done
# --OR--
for path in ${PATH//:/ } /opt/foo/bin /opt/bar/bin; do
[ -x "$path/ls" ] && $path/ls
doneIf the file is not in the $PATH, but could be in a list of locations, possibly even under different names, list the entire path and name: ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access