#!/bin/sh set -eu usage() { cat <<-'EOF' Usage: without-env ENVVAR PATH COMMAND... without-env -h EOF } help() { cat <<-'EOF' Options: -h, --help show this message ENVVAR the name of the environment variable to be modifed PATH section to be excluded from ENVVAR COMMAND command to be wrapped Execute COMMAND, but changing the variable ENVVAR by excluding PATH from it. Examples: Execute "command -V" filtering ~/bin, to get where "w3m" is in $PATH, other than ~/bin: $ without-env PATH ~/bin -- command -v w3m Compile foo.c, excluding ~/.local/include from $C_INCLUDE_PATH: $ without-env C_INCLUDE_PATH ~/.local/include -- cc -co foo.o foo.c EOF } for flag in "$@"; do case "$flag" in (--) break ;; (--help) usage help exit ;; (*) ;; esac done while getopts 'h' flag; do case "$flag" in (h) usage help exit ;; (*) usage >&2 exit 2 ;; esac done shift $((OPTIND - 1)) eval "$(assert-arg -- "${1:-}" 'ENVVAR')" eval "$(assert-arg -- "${2:-}" 'PATH')" eval "export $1=\"\$(echo \"\$$1\" | sed \"s|\$2||g\")\"" shift # drop $1 shift # drop $2 if [ "${1:-}" = '--' ]; then shift # drop -- fi "$@"