#!/bin/sh set -e die() { fmt=$1 shift printf "nextbin %s failed: $fmt\n" "$orig_exe" "$@" >&2 exit 1 } usage() { # shellcheck disable=SC2016 echo 'usage: nextbin [-v] "$0" "$@"' >&2 } case "$1" in -v) action="echo"; shift;; -*|'') usage; exit 1;; *) action="exec" esac orig_exe=$1 shift exe_name=${orig_exe##*/} [ -n "$PATH" ] || die 'PATH is empty' path=$PATH phase=1 found= while :; do exe=${path%%:*}/$exe_name if [ -f "$exe" ] && [ -x "$exe" ]; then if [ "$phase" = 1 ]; then if [ "$exe" -ef "$orig_exe" ]; then phase=2 fi elif [ "$exe" -ef "$orig_exe" ]; then if [ -n "$found" ]; then die 'duplicate PATH entries found' fi elif [ -z "$found" ]; then found=$exe fi fi case $path in *:*) path=${path#*:} ;; *) break ;; esac done [ "$phase" != 1 ] || found=$(command -v "$exe_name") || die '%s is not in PATH' "$orig_exe" [ -n "$found" ] || die '%s is last instance' "$orig_exe" $action "$found" "$@"