97 lines
1.5 KiB
Bash
Raw Normal View History

set +o posix
quiet_safe_cd() {
cd "$1" >/dev/null || { echo "Error: failed to cd to $1" >&2; exit 1; }
}
absdir() {
quiet_safe_cd "${1%/*}/" && pwd -P
}
dirbasepath() {
local dir="$1"
local base="${2##*/}"
echo "$dir/$base"
}
realpath() {
local path="$1"
local dir
local dest
dir="$(absdir "$path")"
path="$(dirbasepath "$dir" "$path")"
while [[ -L "$path" ]]
do
dest="$(readlink "$path")"
if [[ "$dest" = "/"* ]]
then
path="$dest"
else
path="$dir/$dest"
fi
dir="$(absdir "$path")"
path="$(dirbasepath "$dir" "$path")"
done
echo "$path"
}
executable() {
local file="$1"
[[ -f "$file" && -x "$file" ]]
}
lowercase() {
echo "$1" | tr "[:upper:]" "[:lower:]"
}
safe_exec() {
local arg0="$1"
if ! executable "$arg0"
then
return
fi
# prevent fork-bombs
if [[ "$(lowercase "$arg0")" = "$SHIM_FILE" || "$(realpath "$arg0")" = "$SHIM_REAL" ]]
then
return
fi
if [[ "$HOMEBREW" = "print-path" ]]
then
local dir
dir="$(quiet_safe_cd "${arg0%/*}/" && pwd)"
local path
path="$(dirbasepath "$dir" "$arg0")"
echo "$path"
exit
fi
exec "$@"
}
try_exec_non_system() {
local file="$1"
shift
IFS=$'\n'
for path in $(type -aP "$file")
do
if [[ "$path" != "/usr/bin/$file" ]]
then
safe_exec "$path" "$@"
fi
done
unset IFS
}
SHIM_FILE="${0##*/}"
SHIM_REAL="$(realpath "$0")"
if [[ "$1" = --homebrew=* ]]
then
HOMEBREW="${1:11}"
shift
fi