#!/bin/bash # # find_working: Find a version of some tool in the PATH which actually runs. # Usage: find_working [options] # Options: -a Use arguments to test executable files. Default --help. # -q Don't print path to prog. Just exit 0 if found. # -x Don't try to execute unreadable files. Assume success. # -X Don't try to execute unreadable files. Assume failure. # args="-h -? --help" quiet=0 unreadable= while getopts ":a:qxX" opt; do case $opt in a) args="$OPTARG";; q) quiet=1;; x) unreadable=0;; X) unreadable=1;; esac done shift $((OPTIND-1)) prog="$1"; shift if [ -z "$prog" ]; then echo >&2 "Usage: find_working [options] " echo >&2 "Options: -a Use arguments to test executable files. Default --help." echo >&2 " -q Don't print path to prog. Just exit 0 if found." echo >&2 " -x Don't try to execute unreadable files. Assume success." echo >&2 " -X Don't try to execute unreadable files. Assume failure." exit 1 fi ret= for path in ${PATH//:/ }; do [ -x "$path/$prog" ] || continue if [ -r "$path/$prog" ]; then ldd "$path/$prog" 2>/dev/null | grep "not found" >/dev/null && continue ret="$path/$prog" break elif [ -z "$unreadable" ]; then "$path/$prog" $args 2>&1 | grep " $prog " >/dev/null || continue ret="$path/$prog" break elif [ $unreadable = 0 ]; then ret="$path/$prog" break elif [ $unreadable = 1 ]; then continue fi exit 0 done if [ -n "$ret" ]; then [ $quiet = 0 ] && echo "$ret" exit 0 fi exit 100